2011-06-02 128 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"] 

但它仍然是一个元素的数组。