使用可选前缀或在行首提取 "numbers" 的正则表达式
Regexp to extract "numbers" with optional prefix or at beginning of line
我想从行中提取“数字”(可以是包裹号、发票号等)。它只是非空白字符(例如:123
、ABC
、Abc
、ABC123
、ABC-123
、X-ABC/123/456
- 只是 \S+
正则表达式).
我有可以包含“数字”的行。有两种可能的情况:
- 在行首(非空白字符的第一个字符串)。
- 在行的中间,但标有前缀
Number:
。
示例行:
ABC123 bla bla
Number: ABC123 bla bla
Some words 123 Number: ABC123 bla bla
我想从每个示例行中提取“数字”:ABC123
。
我知道如何为第二种情况编写正则表达式(示例 2 和 3 行):(?:Number: )(\S+)
(前缀为 Number:
的非捕获组和非空白字符的捕获组)。
但是第一种情况呢?
我尝试了什么:
- 前缀可以是可选的:
(?:Number: )?(\S+)
我得到了很多匹配项,但这不是问题,因为我可以在代码的每一行中找到第一个匹配项。
但问题出在比赛 7 中:我得到的是单词 Some
而不是数字 ABC123
。
- 使用起始行。所以有两种选择:起始行和“数字”或前缀和“数字”:
(?:^(\S+))|(?:(?:Number: )(\S+))
.
但问题是一样的,我得到字Some
。这更糟,因为我得到 Number:
- 我可以在行首添加 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+)
代替,甚至更精确的东西。
我想从行中提取“数字”(可以是包裹号、发票号等)。它只是非空白字符(例如:123
、ABC
、Abc
、ABC123
、ABC-123
、X-ABC/123/456
- 只是 \S+
正则表达式).
我有可以包含“数字”的行。有两种可能的情况:
- 在行首(非空白字符的第一个字符串)。
- 在行的中间,但标有前缀
Number:
。
示例行:
ABC123 bla bla
Number: ABC123 bla bla
Some words 123 Number: ABC123 bla bla
我想从每个示例行中提取“数字”:ABC123
。
我知道如何为第二种情况编写正则表达式(示例 2 和 3 行):(?:Number: )(\S+)
(前缀为 Number:
的非捕获组和非空白字符的捕获组)。
但是第一种情况呢?
我尝试了什么:
- 前缀可以是可选的:
(?:Number: )?(\S+)
我得到了很多匹配项,但这不是问题,因为我可以在代码的每一行中找到第一个匹配项。
但问题出在比赛 7 中:我得到的是单词 Some
而不是数字 ABC123
。
- 使用起始行。所以有两种选择:起始行和“数字”或前缀和“数字”:
(?:^(\S+))|(?:(?:Number: )(\S+))
.
但问题是一样的,我得到字Some
。这更糟,因为我得到 Number:
- 我可以在行首添加 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+)
代替,甚至更精确的东西。