我想匹配一系列首字母,整个序列,以下示例中的 second 正则表达式正确地为我做了。为什么我需要“全球”旗帜?第一个也应该只匹配整个字符串,对吗? (因为^
和$
)
abc = "A.B.C."
abc.match(/^([A-Z]\.)+$/) // result: ["A.B.C.", "C."]
abc.match(/^([A-Z]\.)+$/g) // result: ["A.B.C."]
谢谢!
答案 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."]