[英]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.