问题:这是一个错误,还是我的误解?
这是一个接受“红色气球”或“蓝色气球”的正则表达式,如node.js REP 中所示。我使用“非捕获”?:形式,因为我对捕获颜色不感兴趣:
/A (?:red)|(?:blue) balloon!/.exec("A red balloon!")
=> [ 'A red', index: 0, input: 'A red balloon!' ]
到目前为止,一切都很好。现在我想匹配红色或蓝色的“球”或“气球”或“弹道导弹”或其他什么并捕获它:
/A (?:red)|(?:blue) (ba.+)!/.exec("A red ball bearing!")
=> [ 'A red', undefined, index: 0, input: 'A red ball bearing!' ]
它匹配,但未能捕获第二种形式(“滚珠轴承”)。 (无论如何,regex101.com 中的相同形式不匹配。)为了使其捕获,我必须将整个“or”子句包装在另一个非捕获括号中:
/A (?:(?:red)|(?:blue)) (ba.+)!/.exec("A red ball bearing!")
=> [ 'A red ball bearing!', 'ball bearing', index: 0, input: 'A red ball bearing!' ]
所以问题是:为什么第二种形式不起作用? (或者为什么它在 javascript 中匹配,而在 regex101.com 中不匹配?)为什么引入另一个非捕获子句会对后续捕获子句产生影响?或者这表明存在错误?
最佳答案
它将其解释为:
A(?:红色)
或者
(?:blue) (ba.+)!
这就是它捕获“A red”的原因。添加括号后,它就会正确捕获。就像操作顺序一样。
有了括号,它就变成了:
A
红色或蓝色
ba.+
!
关于javascript - "a or b"正则表达式中的非捕获括号(运算符优先级),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30249363/