我想在JavaScript正則表達式來使用這樣的模式:的Javascript正則表達式的問題
"foo.bar".match(/foo\.(buz|bar)/)
但不是如我所料返回foo.bar,它返回一個數組:
我不明白。我如何匹配foo.bar和foo.buz?
我想在JavaScript正則表達式來使用這樣的模式:的Javascript正則表達式的問題
"foo.bar".match(/foo\.(buz|bar)/)
但不是如我所料返回foo.bar,它返回一個數組:
我不明白。我如何匹配foo.bar和foo.buz?
您正確匹配「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
執行全局搜索,因此結果數組中的元素用於顯示所有完整匹配(並且在您的情況下,只有一個)。
正則表達式匹配以這種方式工作,即組的第一個元素是整個正則表達式匹配的整個字符串。同樣的方法,如果你會成爲一個「大」組。
/(foo\.(buz|bar))/
第二和後面所有的元素都是那些你用你自己的匹配 - 因此它是buz
或bar
:
(buz|bar)
在這種情況下,如果你想不批只是BUZ /酒吧,您可以排除使用?:
"foo.bar".match(/foo\.(?:buz|bar)/)
你的結果將本組的樣子:
["foo.bar"]
但它仍然是一個元素的數組。
但不是第一個匹配foo.bar?還是從右側進行搜索? – stib 2011-06-02 06:49:38
@stib我誤解了這個問題,抱歉,修正了答案。 – Nicole 2011-06-02 06:50:45
謝謝。我仍然不確定我是否完全理解那裏發生的事情,但至少我可以讓它工作。 「非捕獲組」這個詞讓我足夠做更多的研究(因爲谷歌搜索?:不起作用) – stib 2011-06-02 06:57:06