没有全局标志的Javascript正则表达式奇怪的匹配

时间:2012-05-30 15:47:43

标签: javascript regex

我想匹配一系列首字母,整个序列,以下示例中的 second 正则表达式正确地为我做了。为什么我需要“全球”旗帜?第一个也应该只匹配整个字符串,对吗? (因为^$

abc = "A.B.C."
abc.match(/^([A-Z]\.)+$/) // result: ["A.B.C.", "C."]
abc.match(/^([A-Z]\.)+$/g) // result: ["A.B.C."]

谢谢!

3 个答案:

答案 0 :(得分:3)

因为parens不包括+。因此,当您执行abc.match(/^([A-Z]\.)+$/)时,parens仅匹配第一个[A-Z]\.

要获得所需的匹配,您不需要g标记。只需使用match[0]作为结果。

var result = abc.match(/^([A-Z]\.)+$/)
if (result) {
    var fullMatch = result[0];
}

此处的演示演示:http://jsfiddle.net/jfriend00/PXF6U/

请参阅Bergi的答案,详细了解为什么g标志会像您观察到的那样改变响应。

答案 1 :(得分:2)

请参阅.match() method的文档:

  

如果正则表达式不包含g标志,则返回与regexp.exec(string)相同的结果。

这是你的“意外结果”。请参阅其description:它将返回一个包含捕获组的数组,匹配的字符串,匹配的索引等。作为第二个数组项的"C."是{{1的最后一次捕获表达式。然而, 只匹配整个字符串一次。

  

如果正则表达式包含g标志,则该方法返回包含所有匹配项的Array。如果没有匹配项,则该方法返回null。

“所有匹配”数组只有一个项目,因为您匹配([A-Z]\.)

因此,无论您使用哪个正则表达式,代码都应该是:

^...$

答案 2 :(得分:2)

如果将量词(在本例中为+)应用于捕获子模式(([A-Z]\.)),则仅捕获该重复子模式的最后一个实例(因为它是结果数组的索引1) ,每次找到新的时候都会被覆盖。)

如果您想获得个别比赛,请尝试:

abc.match(/[A-Z]\./g);

这会给你:

["A.","B.","C."]