regex - 什么时候我们需要使用非捕获组?

标签 regex

根据this answer的评论, (?:(?!ab).)*(?!.*ab).* 更高效。为什么?前瞻/后瞻不是已经无法捕获了吗?

基本上,我试图弄清楚我是否需​​要执行 (\^(?:(?=(?:\d+=|\|$)))) 或者如果我可以这样做 (\^(?=\d+=|\|$))。两者都可以捕获所有 ^ 后跟 ###=|..

示例:

1=5^2=A^3=6^|

我想要获得三个 ^ 匹配项(我确实这么做了)。所以,问题是:如果我还没有捕获先行的内容,我是否想要添加非捕获组?

最佳答案

在您的情况下,您不需要捕获组,因为前瞻已经限制了交替的范围:

(\^(?:(?=(?:\d+=|\|$))))

可以在不改变功能的情况下重写为

(\^(?=\d+=|\|$))

字符串开头的示例是另一回事,因为它在组内/外使用重复。这里存在差异,不仅在效率上,而且在可能的匹配上:

(?:(?!ab).)*

匹配“xxxab”中的xxx,而

(?!.*ab).*

匹配b

关于regex - 什么时候我们需要使用非捕获组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24536989/

相关文章:

c - C 中的 POSIX 正则表达式不起作用

java - 有人知道为什么 String.matches(regex) 不能处理 ANSI 颜色字符串吗?

java - JFlex 正则表达式与词法规则中的关键字

javascript - 设置自定义 HTML5 有效性消息属性会忽略模式正则表达式

python - 在 dna 序列中进行反向互补的函数

用于递归查找字符串的正则表达式?

python - 正则表达式 获取介于两者之间的一切,Python

java - Freemarker:选择字符串中字符的最后一个实例

regex - 解析多个名称 - 正则表达式中间的 Lookbehind 不起作用

python - python re (regex) 是否有 unicode 转义序列的替代方案?