繁体   English   中英

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

[英]JavaScript regular expression with global match help needed

我是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'对代码的影响感到困惑。

我非常感谢任何澄清。

提前致谢。

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

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

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

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

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

最后,我想指出一些与您的代码有关的小问题。

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

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

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

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

console.write(match3)

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

String.match上引用文档

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM