使用可选前缀或在行首提取 "numbers" 的正则表达式

Regexp to extract "numbers" with optional prefix or at beginning of line

我想从行中提取“数字”(可以是包裹号、发票号等)。它只是非空白字符(例如:123ABCAbcABC123ABC-123X-ABC/123/456 - 只是 \S+ 正则表达式).

我有可以包含“数字”的行。有两种可能的情况:

  1. 在行首(非空白字符的第一个字符串)。
  2. 在行的中间,但标有前缀 Number:

示例行:

ABC123 bla bla
Number: ABC123 bla bla
Some words 123 Number: ABC123 bla bla

我想从每个示例行中提取“数字”:ABC123


我知道如何为第二种情况编写正则表达式(示例 2 和 3 行):(?:Number: )(\S+)(前缀为 Number: 的非捕获组和非空白字符的捕获组)。

但是第一种情况呢?

我尝试了什么:

  1. 前缀可以是可选的:(?:Number: )?(\S+)

我得到了很多匹配项,但这不是问题,因为我可以在代码的每一行中找到第一个匹配项。

但问题出在比赛 7 中:我得到的是单词 Some 而不是数字 ABC123

  1. 使用起始行。所以有两种选择:起始行和“数字”或前缀和“数字”:(?:^(\S+))|(?:(?:Number: )(\S+)).

但问题是一样的,我得到字Some。这更糟,因为我得到 Number:

  1. 我可以在行首添加 not Number: 以消除上一步中的第二个问题:(?:^(?!Number:)(\S+))|(?:(?:Number: )(\S+)).

但在行首获取随​​机词 (Some) 仍然存在问题,即使行中存在前缀 Number: 和“数字”。


演示:https://regex101.com/r/G9UFak/1

问题有点类似于:

您可以使用

(?:.*Number:\s*|^)(\S+)

参见regex demo

详情

  • (?:.*Number:\s*|^) - 两种选择之一:
    • .*Number:\s* - 除换行字符外的任何零个或多个字符,尽可能多,Number: 和零个或多个空格(如果您需要留在行上,请替换 \s[^\S\r\n]\h / [\p{Zs}\t](如果支持)
    • | - 或
    • ^ - 行首(在类似 PCR0 的引擎中使用 m 选项)
  • (\S+) - 第 1 组:任何一个或多个非空白字符。

我会使用:

^(?:.*?Number: )?(\S+)

前导文本和“编号:”都是可选的。看网上demo

  • ^ - 起始行锚点。
  • (?: - 打开非捕获组:
    • .*? - 除换行符外的 0+ 个字符(惰性)。
    • Number: - 字面意思是“数字:”。
    • )? - 关闭非捕获组并使其成为可选的。
  • (\S+) - 捕获 1+ 个非空白字符的语法。我会说也许您想使用 (\w+) 代替,甚至更精确的东西。