问题描述
我想从行中提取“数字”(可以是包裹号、发票号等)。它只是非空白字符(例如:123
、ABC
、Abc
、ABC123
、ABC-123
、X-ABC/123/456
- 只需 {{1} } 正则表达式).
我有可以包含“数字”的行。有两种可能的情况:
- 在行首(第一串非空白字符)。
- 在行中间,但用前缀
\S+
标记。
示例行:
Number:
从每个示例行中我想提取“数字”:ABC123 bla bla
Number: ABC123 bla bla
Some words 123 Number: ABC123 bla bla
。
我知道如何为第二种情况编写正则表达式(示例 2 和 3 行):ABC123
(带有前缀 (?:Number: )(\S+)
的非捕获组和带有非空白字符的捕获组)。
但是第一种情况呢?
我尝试了什么:
- 前缀可以是可选的:
Number:
我得到了很多匹配,但这不是问题,因为我可以在代码的每一行中得到第一个匹配。
但问题出在第 7 场比赛中:我得到单词 (?:Number: )?(\S+)
而不是数字 Some
。
- 使用起始行。所以有两种选择:起始行和“数字”或前缀和“数字”:
ABC123
。
但问题是一样的,我得到了 (?:^(\S+))|(?:(?:Number: )(\S+))
这个词。这更糟,因为我得到 Some
- 我不能在行首添加
Number:
以消除上一步中的第二个问题:Number:
。
但是即使在行中间存在前缀 (?:^(?!Number:)(\S+))|(?:(?:Number: )(\S+))
和“number”,在行首获取随机单词 (Some
) 仍然存在问题。
演示:https://regex101.com/r/G9UFak/1
问题有点类似于:Regex multiple characters but without specific string
解决方法
你可以使用
(?:.*Number:\s*|^)(\S+)
参见regex demo。
详情
-
(?:.*Number:\s*|^)
- 两种选择之一:-
.*Number:\s*
- 除换行符以外的任何零个或多个字符,尽可能多,Number:
和零个或多个空格(如果您需要保持在线,请替换 {{1} } 与\s
或[^\S\r\n]
/\h
(如果支持) -
[\p{Zs}\t]
- 或 -
|
- 一行的开始(在类似 PCR0 的引擎中使用^
选项)
-
-
m
- 第 1 组:任何一个或多个非空白字符。
我会使用:
^(?:.*?Number: )?(\S+)
前导文本和“数字:”都是可选的。查看在线demo
-
^
- 起点线锚点。 -
(?:
- 打开非捕获组:-
.*?
- 除换行符以外的 0+ 个字符(惰性)。 -
Number:
- 字面意思是“数字:”。 -
)?
- 关闭非捕获组并将其设为可选。
-
-
(\S+)
- 捕获 1+ 个非空白字符的语法。我想说,也许您想改用(\w+)
,或者更精确的东西。