9

可选的非捕获组是多余的吗?

是以下正则表达式:

(?:wo)?men

语义上等同于以下正则表达式?

(wo)?men
4

1 回答 1

12

你的(?:wo)?men(wo)?men在语义上是等价的,但在技术上是不同的,即第一个是使用非捕获组,另一个是捕获组。因此,问题是当我们有捕获组时为什么要使用非捕获组

非捕获组有时会有所帮助。

  1. 避免过多的反向引用(请记住,有时很难使用高于 9 的反向引用)
  2. 为了避免 99 个编号的反向引用限制的问题(通过减少编号的捕获组的数量)(来源:Regular-expressions.info大多数正则表达式支持多达 99 个捕获组和两位数的反向引用。
    注意这不属于Java 正则表达式引擎,PHP 或 .NET 正则表达式引擎。
  3. 减少将捕获存储在堆栈中引起的开销
  4. 我们可以在现有的正则表达式中添加更多分组,而不会破坏捕获组的顺序。

此外,它只是让我们的比赛更干净

您可以使用非捕获组来保留组织或分组的好处,但没有捕获的开销。

重构现有正则表达式以将捕获转换为非捕获组似乎不是一个好主意,因为它可能会破坏代码或需要太多努力。

于 2015-07-19T11:08:39.663 回答