Regexp提取“;“数字”;带可选前缀或在行首

Regexp提取“;“数字”;带可选前缀或在行首,regex,regex-lookarounds,regex-greedy,Regex,Regex Lookarounds,Regex Greedy,我想从行中提取“编号”(可以是包裹号、发票号等)。它只是非空白字符(例如:123,ABC,ABC,ABC123,ABC-123,X-ABC/123/456-简单地说就是\s+regexp) 我有可以包含“数字”的行。有两种可能的情况: 在行的开头(非空白字符的第一个字符串) 在行的中间,但标有前缀编号: 示例行: ABC123 bla bla Number: ABC123 bla bla Some words 123 Number: ABC123 bla bla 我想从每个示例行中提取“数字”

我想从行中提取“编号”(可以是包裹号、发票号等)。它只是非空白字符(例如:
123
ABC
ABC
ABC123
ABC-123
X-ABC/123/456
-简单地说就是
\s+
regexp)

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

  • 在行的开头(非空白字符的第一个字符串)
  • 在行的中间,但标有前缀
    编号:
  • 示例行:

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


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

    但第一个病例怎么办?

    我尝试的是:

  • 前缀可以是可选的:
    (?:编号:)(\S+)
  • 我有很多匹配项,但这不是问题,因为我可以在代码的每一行中获得第一个匹配项

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

  • 使用起始线。所以有两种选择:起始行和“数字”或前缀和“数字”:
    (?:^(\S+))|(?:(?:数字:)(\S+)
  • 但是问题是一样的,我得到了word
    一些
    。这更糟糕,因为我得到了
    Number:

  • 我可以在行首添加not
    Number:
    以消除上一步的第二个问题:
    (?:^(?!Number:)(\S+)|(?:(?:Number:)(\S+)
  • 但是,即使在前缀<代码>编号时,仍然存在随机字词(<代码>一些< /代码>)的问题。


    演示:

    问题有点类似于:

    您可以使用

    (?:.*编号:\s*|^)(\s+)
    

    细节

    • (?:.*编号:\s*| ^)
      -两种选择之一:
      • *Number:\s*
        -除换行符以外的任何零个或多个字符,尽可能多,
        编号:
        和零个或多个空格(如果需要保持在线,请将
        \s
        替换为
        [^\s\r\n]
        \h
        [\p{Zs}\t]
        (如果支持的话)
      • |
        -或
      • ^
        -线路起点(在类似PCR0的发动机中使用
        m
        选项)
    • (\S+)
      -组1:任何一个或多个非空白字符
    您可以使用

    (?:.*编号:\s*|^)(\s+)
    

    细节

    • (?:.*编号:\s*| ^)
      -两种选择之一:
      • *Number:\s*
        -除换行符以外的任何零个或多个字符,尽可能多,
        编号:
        和零个或多个空格(如果需要保持在线,请将
        \s
        替换为
        [^\s\r\n]
        \h
        [\p{Zs}\t]
        (如果支持的话)
      • |
        -或
      • ^
        -线路起点(在类似PCR0的发动机中使用
        m
        选项)
    • (\S+)
      -组1:任何一个或多个非空白字符
      • 我会使用:

        ^(?:.*?Number: )?(\S+)
        
        其中,前导文本和“编号:”都是可选的。在线查看

        • ^
          -起锚线
        • (?:
          -打开非捕获组:
          • *?
            -0个以上字符(惰性),换行符除外
          • 编号:
            -字面意思是“编号:”
          • )?
            -关闭非捕获组并将其设置为可选
        • (\S+)
          -用于捕获1+个非空白字符的语法。我想说也许你想用
          (\w+)
          来代替,或者更精确一些
          • 我会使用:

            ^(?:.*?Number: )?(\S+)
            
            其中,前导文本和“编号:”都是可选的。在线查看

            • ^
              -起锚线
            • (?:
              -打开非捕获组:
              • *?
                -0个以上字符(惰性),换行符除外
              • 编号:
                -字面意思是“编号:”
              • )?
                -关闭非捕获组并将其设置为可选
            • (\S+)
              -用于捕获1+个非空白字符的语法。我想说也许你想用
              (\w+)
              来代替,或者更精确一些