2011-06-02 79 views
2

我想在JavaScript正則表達式來使用這樣的模式:的Javascript正則表達式的問題

"foo.bar".match(/foo\.(buz|bar)/) 

但不是如我所料返回foo.bar,它返回一個數組:

​​

我不明白。我如何匹配foo.bar和foo.buz?

回答

3

您正確匹配「foo.bar」或「foo.buz」,但因爲你有一個分組((...)),返回數組包含多個項目:

[全場比賽匹配1第2場,...,匹配ñ]

根據the spec,結果是總是一個數組,而完全匹配的文本將是元素0。元素1 ... N將是匹配(在你的情況下,「酒吧」或「布斯」)。

如果你想確保你的數組的長度爲1,那麼你想放?:(後,使之成爲非捕獲組(見https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions,語法(?:x)):

"foo.bar".match(/foo\.(?:buz|bar)/) 

然而,這沒有必要,因爲您可以隨時參考完整匹配result[0]

順便說一下,/g選項(請再次參見the docs)也將擺脫結果數組中的捕獲組。由於/g執行全局搜索,因此結果數組中的元素用於顯示所有完整匹配(並且在您的情況下,只有一個)。

+0

但不是第一個匹配foo.bar?還是從右側進行搜索? – stib 2011-06-02 06:49:38

+0

@stib我誤解了這個問題,抱歉,修正了答案。 – Nicole 2011-06-02 06:50:45

+0

謝謝。我仍然不確定我是否完全理解那裏發生的事情,但至少我可以讓它工作。 「非捕獲組」這個詞讓我足夠做更多的研究(因爲谷歌搜索?:不起作用) – stib 2011-06-02 06:57:06

2

正則表達式匹配以這種方式工作,即組的第一個元素是整個正則表達式匹配的整個字符串。同樣的方法,如果你會成爲一個「大」組。

/(foo\.(buz|bar))/ 

第二和後面所有的元素都是那些你用你自己的匹配 - 因此它是buzbar

(buz|bar) 

在這種情況下,如果你想不批只是BUZ /酒吧,您可以排除使用?:

"foo.bar".match(/foo\.(?:buz|bar)/) 

你的結果將本組的樣子:

["foo.bar"] 

但它仍然是一個元素的數組。