带有捕获组的RegEx中的空白问题

Dov*_*Dov 4 regex whitespace capture-group

我有一个正则表达式,我试图匹配以下类型的数据,每个标记由未知数量的空格分隔.

更新:"文字"几乎可以是任何字符,这就是我.*最初的原因.重要的是,它还可以包括空格.

  1. 文本
  2. 文字01
  3. 03年第01号
  4. 文字01(03)
  5. 文字01-03

我想将"Text","01"和"03"作为单独的组捕获,除"Text"之外的所有组都是可选的.到目前为止我能做的最好的是:

\s*(.*)\s+(\d+)\s*(?:\s*\(?\s*(?:of|-)\s*(\d+)\s*\)?\s*)
Run Code Online (Sandbox Code Playgroud)

这匹配#3-#5,并将它们放在适当的捕获组中.但是,我无法弄清楚,为什么当我?在结尾处添加一个额外的部分以使表达式成为01可选项后,我的捕获组会变得非常时髦.

\s*(.*)\s+(\d+)\s*(?:\s*\(?\s*(?:of|-)\s*(\d+)\s*\)?\s*)?
Run Code Online (Sandbox Code Playgroud)

上面的RegEx匹配#2-#5,但捕获组仅对#2和#5正确.

这似乎是一个简单的正则表达式,所以我不知道为什么我遇到这么多麻烦.

这是一个在线RegEx评估员的链接,我用来帮助我调试这个:http://regexr.com?2tb64 .该链接已经有第一个RegEx和填写的测试数据.

rid*_*ner 6

你没有说你正在使用哪个正则表达式工具,所以我假设最小公分母即Javascript.这是一个有效的:

var re = /^\s*(.+?)(?:\s+(\d+)(?:(?:\s+\(?of\s+|-)(\d+)\)?)?)?$/i;
Run Code Online (Sandbox Code Playgroud)

要在Regexr工具中使其工作,请务必打开"多行选项".

在PHP语法中有同样的东西(有很多多汁的评论!):

$re = '/ # Always write non-trivial regex in free-space mode!
    ^                  # Anchor to start of string.
    \s*                # optional leading whitspace is ok.
    (.+?)              # Text can be pretty much anything.
    (?:                # Group to allow applying ? quantifier
      \s+              # WS separates "Text" from first number.
      (\d+)            # First number.
      (?:              # Group to allow applying ? quantifier
        (?:            # Second number prefix alternatives
          \s+\(?of\s+  # Either " of 03" and " (of 03)",
        | -            # or just a dash  for "-03" case.
        )              # End second number prefix alternatives
        (\d+)          # Second number
        \)?            # Match ")" for " (of 03)" case.
      )?               # Second number is optional.
    )?                 # First numebr is optional.
    $                  # Anchor to start of string.
    /ix';
Run Code Online (Sandbox Code Playgroud)