我是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'对代码的影响感到困惑。
我非常感谢任何澄清。
提前致谢。
答案 0 :(得分:4)
关键的区别在于,如果正则表达式模式是全局的,string.match
方法defined具有不同的行为。
如果模式是全局的,则为包含所有匹配项的数组。在你的情况下,你只有一个匹配,但你可以看到与
之类的例子的区别
let matches = "aaaa".match(/a(a)/g);
console.log(matches) // returns ["aa", "aa"]
&#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
,每个元素都是不同的匹配。