我想在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