2015-07-19 44 views
5

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

是以下的正则表达式:

(?:wo)?men 

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

(wo)?men 
+0

我认为这将取决于您所使用的正则表达式。 Java的标准正则表达式字符串可能需要它,而我相当确定Perls会认为它是多余的。 – thecoshman

+4

非捕获基团是重上的处理器(因为它需要额外的处理),而捕获基团是重上存储器(因为它具有存储许多东西)。但是,它们在语义上是等价的,因为它们可以以不同的方式匹配相同的事物。你可以把它们看作是具有不同引擎的汽车,但都可以作为骑行的一种手段。 –

回答

7

(?:wo)?men(wo)?men和在语义上等价的,但在技术上是不同的,即,首先是使用非捕获和其它捕获组。因此,问题是为什么使用非捕获组,当我们捕捉那些

非caprturing团体的帮助的时候。

  1. 为了避免反向引用(记住,这是有时很难使用反向引用高于9)
  2. 为了避免与99编号的反向引用极限的问题(通过减小编号捕获基团的数目)(源的数量过多:Regular-expressions.info大多数正则表达式支持多达99个捕获组和两位数的反向引用
    注意这不属于Java正则表达式引擎,也不适用于PHP或.NET正则表达式引擎。
  3. lessen the overhead由将捕获存储在堆栈中导致
  4. 我们可以在不破坏捕获组顺序的情况下向现有正则表达式添加更多分组。

而且,它只是makes our matches cleaner

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

将现有的正则表达式转换为将捕获转换为非捕获组似乎不是一个好主意,因为它需要付出很多努力。

+0

此评论更多是一个编辑,你不觉得吗? –

+2

请注意,99反向引用限制与Java正则表达式引擎无关。在Java中捕获组的数量存储在*瞬时INT capturingGroupCount *,因此,理论上,可以有大量的反向引用,但有数量可以通过内存限制为上限。 –

+0

我试图找到我们正在讨论的开销多少以及这实际上具有什么影响(Java和Javascript)。 在性能方面使用非捕获组是否有任何实际益处? – runlevel0