非捕获组是多余的吗?

时间:2015-07-19 10:57:17

标签: java regex capture-group

可选的非捕获组是否冗余?

以下是正则表达式:

(?:wo)?men

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

(wo)?men

1 个答案:

答案 0 :(得分:8)

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

非担任团体有时会提供帮助。

  1. 避免过多的反向引用(请记住有时很难使用高于9的反向引用)
  2. 避免99编号反向引用限制的问题(通过减少编号的捕获组的数量)(来源:Regular-expressions.info大多数正则表达式支持最多99个捕获组和两位数的反向引用。 / em>)
    注意这不适用于Java正则表达式引擎,也不适用于PHP或.NET正则表达式引擎。
  3. 通过将捕获存储在堆栈中导致lessen the overhead
  4. 我们可以在不破坏捕获组的顺序的情况下为现有的正则表达式添加更多分组。
  5. 此外,它只是makes our matches cleaner

      

    您可以使用非捕获组来保留组织或分组权益,但不会产生捕获的开销。

    重新考虑现有正则表达式以将捕获转换为非捕获组似乎不是一个好主意,因为它may ruin the code或需要太多努力。