根据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/