javascript - "a or b"正则表达式中的非捕获括号(运算符优先级)

标签 javascript regex

问题:这是一个错误,还是我的误解?

这是一个接受“红色气球”或“蓝色气球”的正则表达式,如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/

相关文章:

python - 表达式在 Windows 上匹配,但在 Mac 上不匹配

regex - 如何用正则表达式查找包含某个字母的单词?

PHP:将文本链接转换为 anchor 标记

javascript - 如何将 jquery 库和 js 文件加载到 WordPress 主题中?

javascript - 将 JS 函数添加到并行队列

javascript - ReactJS 在渲染状态下循环

javascript - 在 Laravel 应用程序中延迟加载 vue 组件 - 不加载

javascript - 表格单元格高度匹配背景高度

regex - 如何在rewritecond中匹配www和非www?

c# - 在 .NET 中换行