为什么这些非捕获正则表达式组不能正常工作?

时间:2013-10-25 22:08:53

标签: regex matching

所以我花了很多时间在另一个堆栈溢出问题上,同样的问题出现了前一个问题。非捕获组不能像我期望的那样工作,或者我相信。

这是一个愚蠢的例子,与其他人的CSS测试字符串一致......

这是我的正则表达式:

(?:(rgb\([^)]*\)|\S+)(?:[ ]+)?)*

这是测试字符串:

1px solid rgb(255, 255, 255) test rgb(255, 255, 255)

我期待匹配组“1px”,“solid”,“rgb(255,255,255)”,“test”,“rgb(255,255,255)”

但我只得到最后一个令牌匹配。

这是测试的链接:

http://regex101.com/r/pK1uG7

这里出了什么问题?我以为我有非捕获组,并且在regex101底部解释它的方式是有道理的,包括“贪婪”。

2 个答案:

答案 0 :(得分:3)

捕获组会覆盖之前的每个匹配项。捕获组#1首先匹配“1px”,然后捕获组#1匹配“solid”覆盖“1px”,然后匹配“rgb(255,255,255)”覆盖“solid”等。

答案 1 :(得分:2)

为此,您需要使用全局选项:

/(rgb\([^)]+\)|\S+)/g

http://regex101.com/r/kF2uV4

非捕获组从组中消除其结果。 所以,如果你想匹配:

"1px","solid", "rgb(255, 255, 255)", "test", "rgb(255, 255, 255)"

然后你不想那样使用捕获组。

请参阅:What is a non-capturing group? What does a question mark followed by a colon (?:) mean?

在顶部看到里卡多·诺尔德的答案。 你正在消除你想要的那些。