Javascript正则表达式问题

时间:2011-06-02 06:47:03

标签: javascript regex

我正在尝试在javascript regexp中使用这样的模式:

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

但不是像我期望的那样返回foo.bar,而是返回一个数组:

["foo.bar", "bar"]

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

2 个答案:

答案 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))/

第二个和所有下一个元素都是您自己匹配的元素 - 因此它是buzbar

(buz|bar)

在这种情况下,如果您不想只批量buz / bar,则可以使用?:

排除此群组
"foo.bar".match(/foo\.(?:buz|bar)/)

您的结果如下:

["foo.bar"]

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