Regex 带有捕获组的正则表达式中的空格问题

Regex 带有捕获组的正则表达式中的空格问题,regex,whitespace,capture-group,Regex,Whitespace,Capture Group,我有一个正则表达式,我试图与以下类型的数据进行匹配,每个标记由未知数量的空格分隔 更新:“文本”几乎可以是任何字符,这就是我最初使用*的原因。重要的是,它还可以包括空间 正文 文本01 文本01/03 文本01(共03页) 文本01-03 我想将“Text”、“01”和“03”作为单独的组进行捕获,除“Text”之外的所有组都是可选的。到目前为止,我能做的最好的事情是: \s*(.*)\s+(\d+)\s*(?:\s*\(?\s*(?:of|-)\s*(\d+)\s*\)?\s*) 这与#3-

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

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

  • 正文
  • 文本01
  • 文本01/03
  • 文本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*)?
    
    上面的正则表达式与#2-#5匹配,但捕获组仅适用于#2和#5

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


    这是指向联机正则表达式求值器的链接,我正在使用该求值器来帮助我调试以下内容:。链接已经有了第一个正则表达式和已填写的测试数据。

    您的第二个已关闭

    所以我修改了:,现在所有的匹配都在正确的组中

    \s*(\w*)\s+(?:\s*(\d+)\s*(?:\s*\(?\s*(?:of|-)\s*(\d+)\s*\)?)?)?
    
    试试这个:

    正则表达式看起来像:

    (\w+?)\s+(\d*)[^\d]*(\d+)
    
    匹配所有字母,后跟任何空格,然后匹配所有数字,后跟任何非数字,然后匹配其余数字

    请注意,第二个结果可能并不理想,因为01出现在第三组比赛中。
    但是它与您的所有情况都匹配。

    您没有说明您使用的是哪个正则表达式工具,所以我假设使用最小公分母,即Javascript。以下是一个有效的方法:

    var re=/^\s*(.+?)(?:\s+(\d+)((?:\s+\(\s+)(\d+)?)?$/i;
    
    要在Regexr工具中实现这一点,请确保启用“多行选项”

    这里的PHP语法也是一样(有很多有趣的注释!):

    $re='/#始终在自由空间模式下编写非平凡的正则表达式!
    ^#锚定至管柱起点。
    \s*#可选的前导空格可以。
    (.+?)#文本几乎可以是任何东西。
    (?:#允许应用?量词的组
    \s+#WS将“文本”与第一个数字分隔开。
    (\d+)#第一个数字。
    (?:#允许应用?量词的组
    (?:#第二个数字前缀选项
    \s+\(?of\s+\“of 03”和“(of 03)”,
    |-#或者只是一个“-03”案例的破折号。
    )#结束第二个数字前缀选项
    (\d+)#第二个数字
    \)#Match“)“for”(of 03)“案例。
    )?               # 第二个数字是可选的。
    )?                 # 第一个numebr是可选的。
    $#锚定到字符串的开头。
    /九",;
    
    我已将您的正则表达式放在regexr.com中,并获得了前4个案例的乱码匹配。。。加上第一组包含整个文本@乔:现在我把它修好了,第一次试得太快了。这几乎是完美的。我需要为第一个\w找出一些不同的东西,因为它实际上可以是几乎任何东西(包括空格),而不仅仅是单词字符。对不起,我之前没有提到,但我现在更新了问题。对于我给出的示例,这很完美。@Dov,是您希望在同一行中匹配的所有内容,即我们可以使用锚定
    ^$
    ?@sterna,是的,它是一个文件名,所以没有换行符。如果文本不是可选的,请使用文本而不是\s*(*)来匹配它,这样更容易阅读,也更简单。谢谢,但是“Text”是任意文本的占位符。谢谢,太好了。我在Obj-C中使用RegexKitLite,它使用Perl语法。我唯一需要做的改变是更自由地允许空白。我的最后一个表达式是:^\s*(.+?)(?:\s+(\d+)(:\s*(?:(?\s*)of |-)\s*(\d+)\s*)?)?\s*$