2013-02-23 68 views
3

我是JavaScript新手,对正则表达式有疑问。我有以下代码:需要全局匹配帮助的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/>"); 

的输出是:八月12,1988

这里是相同的代码,但与来自正则表达式的结尾去除的“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/>"); 

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

从我在网上找到的定义中,'g'应该匹配所有出现的模式。但我仍然对代码上的'g'有什么影响感到困惑。

我非常感谢任何澄清。

在此先感谢。

回答

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]); 
}); 
4

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

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

“AAAA” .match一个例子(/ A(A)/ G)的区别; //返回[“AA”,“AA”]

如果模式不是全局的,然而,该方法返回对应于找到的第一个匹配的阵列。该数组在第一个位置包含完整匹配的字符串,在其他位置包含捕获。捕获是由括号分隔的正则表达式的位。再次,可以看到与实施例的区别是:

“AAAA” .match(/ A(A)/克); //返回[“aa”,“a”]


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

首先,你并不需要在这里使用new Regexp构造。只需使用正则表达式字面直接

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

其次,不要盲目“的toString”的事情。在你的情况下,你正在将这种方法应用于数组,这就是为什么你会得到你奇怪的结果。

最后,学会使用开发工具,包括调试和执行console.log。它比滥用document.write更好,并且在表现力和生产力方面提高警觉。

console.write(match3) 
0

String.match上引用the docs

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

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

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