1

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

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

谢谢!

4

3 回答 3

3

因为括号不包括+. 因此,当您这样做时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 的回答。

于 2012-05-30T15:51:21.043 回答
2

请参阅该.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
于 2012-05-30T15:57:41.717 回答
2

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."]
于 2012-05-30T15:59:46.827 回答