4

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

这是一个愚蠢的例子,类似于别人的 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 底部的解释方式是有道理的,包括“贪婪”。

4

2 回答 2

3

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

于 2013-10-25T22:30:25.733 回答
2

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

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

http://regex101.com/r/kF2uV4

非捕获组从组中消除他们的结果。所以如果你想匹配:

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

那么您不想以这种方式使用捕获组。

请参阅:什么是非捕获组?问号后跟冒号 (?:) 是什么意思?

请参阅顶部的 Ricardo Nolde 的答案。你正在消除那些你说你想要回来的人。

于 2013-10-25T22:29:27.550 回答