繁体   English   中英

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

[英]When do we need to use non-capturing groups?

根据对此答案的评论, (?:(?!ab).)*(?!.*ab).*更有效。 为什么? 向前/向后看已经不是捕捉了吗?

基本上,我试图弄清楚是否需要做(\\^(?:(?=(?:\\d+=|\\|$))))还是我可以做(\\^(?=\\d+=|\\|$)) 两者都可以捕获所有^然后捕获###=| ..

例:

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

我想进行三场^比赛(我做到了)。 因此,问题是:如果我尚未捕获前瞻性内容,是否要添加非捕获组?

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

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

可以重写而无需更改功能,因为

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

字符串开头的示例还有其他内容,因为它在组内/组外使用重复。 这不仅在效率上而且在可能的匹配方面都存在差异:

(?:(?!ab).)*

匹配"xxxab"中的xxx ,而

(?!.*ab).*

匹配b

使用非捕获组对于处理不一定要单独保留的重复模式很有用。

例如,假设您要解析人们的全名。 一个人可以有任意数量的名字和中间名,但只能有一个姓氏。 您想捕获他们的全名和姓氏。
您知道可以使用重复的\\w+\\s+来匹配名称段,但是由于您不知道此人有多少个名字/中间名,因此会出现问题。
您考虑类似^(\\w+\\s+)*(\\w+)$ 捕获姓氏...但是它在哪个捕获组中? 如果不知道此人有多少个名字/中间名,就无法知道。

这就是不捕获组的地方。您需要重复\\w+\\s+模式,但不必关心它获取的特定值。
现在您的表情看起来像^(?:\\w+\\s+)*(\\w+)$
完整的结果是该人的全名,而捕获组的第一名是他们的姓。 无需再猜测结果存储在哪里!


在您的情况下,先行查询就足够了,但这并不意味着非捕获组没有其用途。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM