2012-07-10 253 views
1

可能重複:
Non capturing group?(?:x)字符的要點是什麼?

我學習JavaScript中的正則表達式,而(?:x)字符或「非捕獲括號」只是沒有道理給我。如果你不想讓比賽被記住,爲什麼不完全放棄括號?使用/(?:x)/而不僅僅是/x/有什麼好處?

+0

我相信我在研究中看到了一個,但這個例子看起來很複雜。由於我在學習,我需要簡單的答案。 :) – 2012-07-10 14:26:10

回答

11

因爲您可能需要其他原因的括號。例如,假設您想要捕獲abababababab9末尾的數字。如果你寫了ab*(\d)那麼它會匹配abbbbbbbbb9。您需要將括號加上ab,以便操作員重複整個操作。 (ab)*(\d)。但是也許你不在意ab重複了多少次。這就是你使用(?:)(?:ab)*(\d)的地方。

+1

甜美簡單,謝謝! – 2012-07-10 14:27:38

3

您需要它來定義子模式以用於替代匹配或量詞,這將適用於整個子模式而不會浪費捕獲槽。例如,您可以使用(?:)|在正則表達式的中間提供備用匹配而不捕獲它。

3

考慮以下情況:

(?:aa|bb|cc)

(?:abc)?

可以使用非捕獲組來匹配具有更復雜的子模式模式。在某些情況下,使用非捕獲組語法也會導致更高效的正則表達式。

1

如果你不希望匹配被記住,爲什麼不完全放棄括號?使用/(?:x)/而不是/ x /的優點是什麼?

它使用時要字符,但你不想記住他們。如果刪除括號,則不能對字符序列進行分組。所以,舉例來說:

/foo|bar/.test("foo") // true 
/foo|bar/.test("bar") // true 

如果你想達到匹配foor一個模式,fbar你必須組中的中間人物:

/f(?:oo|ba)r/.test("fbar") // true 
/f(?:oo|ba)r/.test("foor") // true 

當然,也可以組和記憶中組,但是如果使用test您使用match或其他返回數組對您很重要的方法,那麼您必須改用(?: