2015-07-19 23 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