正则表达式提取带有可选前缀或行首的“数字”

问题描述

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

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

  1. 在行首(第一串非空白字符)。
  2. 在行中间,但用前缀 \S+ 标记

示例行:

Number: 

从每个示例行中我想提取“数字”:ABC123 bla bla Number: ABC123 bla bla Some words 123 Number: ABC123 bla bla


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

only first case

但是第一种情况呢?

我尝试了什么:

  1. 前缀可以是可选的:Number:

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

但问题出在第 7 场比赛中:我得到单词 (?:Number: )?(\S+) 而不是数字 Some

first

  1. 使用起始行。所以有两种选择:起始行和“数字”或前缀和“数字”:ABC123

但问题是一样的,我得到了 (?:^(\S+))|(?:(?:Number: )(\S+)) 这个词。这更糟,因为我得到 Some

second

  1. 我不能在行首添加 Number: 以消除上一步中的第二个问题:Number:

但是即使在行中间存在前缀 (?:^(?!Number:)(\S+))|(?:(?:Number: )(\S+)) 和“number”,在行首获取随​​机单词 (Some) 仍然存在问题。

third


演示: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+),或者更精确的东西。