需要全局匹配帮助的JavaScript正则表达式

时间:2013-02-23 00:31:59

标签: javascript regex

我是JavaScript的新手,对正则表达式有疑问。我有以下代码:

var patt3=new RegExp(/(July|August)\s+\d{1,2}(\s|,)\d{4}/g);
var str3 = "August                               12,1988";
var match3 = str3.match(patt3);
document.write(match3.toString() + "<br/>");

输出结果是:1988年8月12日

这是相同的代码,但是从RegExp的末尾删除了'g':

var patt3=new RegExp(/(July|August)\s+\d{1,2}(\s|,)\d{4}/);
var str3 = "August                               12,1988";
var match3 = str3.match(patt3);
document.write(match3.toString() + "<br/>");

输出成为:1988年8月12日,8月,

根据我在网络上发现的定义,'g'应该匹配所有出现的模式。但是我仍然对'g'对代码的影响感到困惑。

我非常感谢任何澄清。

提前致谢。

3 个答案:

答案 0 :(得分:4)

关键的区别在于,如果正则表达式模式是全局的,string.match方法defined具有不同的行为。

如果模式是全局的,则为包含所有匹配项的数组。在你的情况下,你只有一个匹配,但你可以看到与

之类的例子的区别

&#13;
&#13;
let matches = "aaaa".match(/a(a)/g); 
console.log(matches) // returns ["aa", "aa"]
&#13;
&#13;
&#13;

但是,如果模式不是全局模式,则该方法返回与找到的第一个匹配项对应的数组。该数组包含第一个位置的完整匹配字符串和其他位置的捕获。捕获是由括号分隔的正则表达式的位。同样,您可以看到与该示例的不同之处:

"aaaa".match(/a(a)/g); // returns ["aa", "a"]

最后,我想指出代码中的一些小问题。

首先,您不需要在此处使用new Regexp构造函数。只需直接使用正则表达式文字

var patt3 = /(July|August)\s+\d{1,2}(\s|,)\d{4}/g

其次,不要盲目地&#34; toString&#34;的东西。在您的情况下,您正在将该方法应用于数组,这就是您获得奇怪结果的原因。

最后,学习使用开发人员工具,包括debugger和console.log。它比在表现力和生产力方面滥用document.write和警报要好得多。

console.write(match3)

答案 1 :(得分:1)

g仅匹配整个模式的所有匹配项。它不像PHP的preg_match_all那样匹配组。没有g,它只匹配模式的第一个匹配项(matches[0]),所有匹配的组都是其他数组元素。

如果您想获得嵌套匹配,可以使用John Resig描述的概念来执行此操作:

str3.replace(patt3, function () {
    //This is the first captured group in all matches iterated over
    console.log(arguments[1]);
});

答案 2 :(得分:0)

String.match上引用the docs

  

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

     

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

在第二个示例中,数组的第一个元素是匹配,而其他元素是捕获组。使用g,每个元素都是不同的匹配。