6

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

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

  1. 文本
  2. 文字 01
  3. 文本 01 的 03
  4. 文本 01(共 03 个)
  5. 正文 01-03

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

\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 和填充的测试数据。

4

3 回答 3

6

你没有说你使用的是哪个正则表达式工具,所以我假设最小的共同点,即 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';
于 2011-03-19T03:57:08.447 回答
1

你的第二个很接近

所以我重新设计了:regexr,现在匹配所有正确的组。

\s*(\w*)\s+(?:\s*(\d+)\s*(?:\s*\(?\s*(?:of|-)\s*(\d+)\s*\)?)?)?
于 2011-03-18T23:13:06.883 回答
1

试试这个:
http ://regexr.com?2tb67

正则表达式看起来像:

(\w+?)\s+(\d*)[^\d]*(\d+)

匹配所有字母,然后是任何空格,然后匹配所有数字,然后是任何非数字,然后匹配剩余的数字。

请注意,第二个结果可能不适合您,因为 01 出现在第三组比赛中。但它符合你所有的情况。

于 2011-03-18T23:18:18.423 回答