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-
*
的原因。重要的是,它还可以包括空间
\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*$