非捕获组是多余的吗?
可选的非捕获组是多余的吗?
是以下正则表达式:
(?:wo)?men
语义上等同于以下正则表达式?
(wo)?men
你的(?:wo)?men
和(wo)?men
在语义上是等价的,但在技术上是不同的,即第一种是使用非捕获而另一种是捕获组。 因此,问题是为什么在我们捕获它们时使用非捕获组 ?
非承担团体有时会提供帮助。
- 避免过多的反向引用(请记住,有时很难使用高于9的反向引用)
- 为了避免99编号反向引用限制的问题(通过减少编号的捕获组的数量)(来源: Regular-expressions.info : 大多数正则表达式支持多达99个捕获组和两位数的反向引用。 )
注意这不适用于Java正则表达式引擎,也不适用于PHP或.NET正则表达式引擎。 - 减少将捕获存储在堆栈中所导致的开销
- 我们可以在不破坏捕获组的顺序的情况下向现有正则表达式添加更多分组。
此外,它只是使我们的比赛更清洁 :
您可以使用非捕获组来保留组织或分组权益,但不会产生捕获的开销。
重新考虑现有正则表达式以将捕获转换为非捕获组似乎不是一个好主意,因为它可能会破坏代码或需要太多努力。