我想匹配一个首字母序列,整个序列,以下示例中的第二个正则表达式正确地为我做。为什么我需要“全球”标志?第一个也应该只匹配整个字符串,对吧?(因为^
和$
)
abc = "A.B.C."
abc.match(/^([A-Z]\.)+$/) // result: ["A.B.C.", "C."]
abc.match(/^([A-Z]\.)+$/g) // result: ["A.B.C."]
谢谢!
我想匹配一个首字母序列,整个序列,以下示例中的第二个正则表达式正确地为我做。为什么我需要“全球”标志?第一个也应该只匹配整个字符串,对吧?(因为^
和$
)
abc = "A.B.C."
abc.match(/^([A-Z]\.)+$/) // result: ["A.B.C.", "C."]
abc.match(/^([A-Z]\.)+$/g) // result: ["A.B.C."]
谢谢!
因为括号不包括+
. 因此,当您这样做时abc.match(/^([A-Z]\.)+$/)
,括号仅匹配第一个[A-Z]\.
。
要获得您想要的比赛,您不需要g
旗帜。只需match[0]
用作您的结果。
var result = abc.match(/^([A-Z]\.)+$/)
if (result) {
var fullMatch = result[0];
}
在这里工作演示:http: //jsfiddle.net/jfriend00/PXF6U/
g
有关为什么标志会像您观察到的那样更改响应的详细信息,请参阅 Bergi 的回答。
请参阅该.match()
方法的文档:
如果正则表达式不包含 g 标志,则返回与 相同的结果
regexp.exec(string)
。
这是您的“意外结果”。查看它的描述:它将返回一个包含捕获组、匹配字符串、匹配索引等的数组。"C."
作为第二个数组项,您得到的是([A-Z]\.)
表达式的最后一次捕获。然而,它确实只匹配了整个字符串一次。
如果正则表达式包含 g 标志,则该方法返回一个包含所有匹配项的 Array。如果没有匹配项,则该方法返回 null。
“所有匹配项”数组将只有一项,因为您 match ^...$
。
因此,无论您将使用哪个正则表达式,代码都应该是:
var result = abc.match(regex);
if (result) // != null
return result[0];
else
// no match found
If you apply a quantifier (in this case +
) to a capturing subpattern (([A-Z]\.)
) then only the last instance of that repeated subpattern is captured (because it is index 1 of the result array, and it is overwritten every time a new ones is found).
If you want to get the individual matches, try:
abc.match(/[A-Z]\./g);
This will give you:
["A.","B.","C."]