我正在尝试在javascript regexp中使用这样的模式:
"foo.bar".match(/foo\.(buz|bar)/)
但不是像我期望的那样返回foo.bar,而是返回一个数组:
["foo.bar", "bar"]
我不明白。我如何匹配foo.bar和foo.buz?
答案 0 :(得分:3)
您正确匹配“foo.bar”或“foo.buz”,但由于您有分组((...)
),因此返回的数组包含多个项目:
[完全匹配,匹配1 ,匹配2 ,...,匹配N ]
根据the spec,结果始终为数组,完全匹配的文本将为元素0 。元素1 ... N将是匹配(在您的情况下,“bar”或“buz”)。
如果您想确保数组的长度为1,那么您希望在每?:
之后放置(
以使其成为非捕获组(请参阅https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions,syntax {{ 1}}):
(?:x)
但是,这不是必需的,因为您始终只需引用"foo.bar".match(/foo\.(?:buz|bar)/)
即可完全匹配。
顺便提一下,result[0]
选项(再次参见the docs)也将从结果数组中删除捕获组。由于/g
执行全局搜索,因此结果数组中的元素用于显示所有完整匹配(在您的情况下,只有一个)。
答案 1 :(得分:2)
正则表达式匹配以这种方式工作,组的第一个元素是整个正则表达式匹配的整个字符串。如果你要建立一个“大”小组,也是这样。
/(foo\.(buz|bar))/
第二个和所有下一个元素都是您自己匹配的元素 - 因此它是buz
或bar
:
(buz|bar)
在这种情况下,如果您不想只批量buz / bar,则可以使用?:
"foo.bar".match(/foo\.(?:buz|bar)/)
您的结果如下:
["foo.bar"]
但它仍然是一个包含一个元素的数组。