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

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

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

>文字
>文字01
> 03年第01号
>文字01(共03条)
>文字01-03

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

\s*(.*)\s+(\d+)\s*(?:\s*\(?\s*(?:of|-)\s*(\d+)\s*\)?\s*)

这匹配#3-#5,并将它们放在适当的捕获组中.但是,我无法弄清楚为什么当我添加额外的?最后在01选项后制作表达式的一部分,我的捕获组得到了所有的时髦.

\s*(.*)\s+(\d+)\s*(?:\s*\(?\s*(?:of|-)\s*(\d+)\s*\)?\s*)?

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

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

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

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

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

要在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';
相关文章
相关标签/搜索