我无法准确理解JavaScript的方法string.match(regexp)的g标志是如何工作的

时间:2012-06-05 16:42:15

标签: javascript regex string match gflags

在书籍#34; JavaScript:好的部分"中,它解释了方法string.match(regexp),如下所示:

  

match方法匹配字符串和正则表达式。如何   这取决于g标志。如果没有g标志,那么   调用字符串.match(regexp)的结果与调用相同   regexp .exec(string)。但是,如果正则表达式有g标志,那么它   生成所有匹配的数组但不包括捕获   基团:

然后这本书提供了代码示例:

var text = '<html><body bgcolor=linen><p>This is <b>bold<\/b>!<\/p><\/body><\/html>';
var tags = /[^<>]+|<(\/?)([A-Za-z]+)([^<>]*)>/g;
var a, i;
a = text.match(tags);
for (i = 0; i < a.length; i += 1) {
    document.writeln(('// [' + i + '] ' + a[i]).entityify());
}
// The result is
// [0] <html>
// [1] <body bgcolor=linen>
// [2] <p>
// [3] This is
// [4] <b>
// [5] bold
// [6] </b>
// [7] !
// [8] </p>
// [9] </body>
// [10] </html>

我的问题是我无法理解&#34;但不包括捕获组&#34;。

在上面的代码示例中,html中的</html>位于捕获组中。为什么它仍然包含在结果数组中?

/中的</html>也在捕获组中。为什么它包含在结果数组中?

你可以解释一下#34;但不包括捕获组&#34;用上面的代码示例?

非常感谢!

2 个答案:

答案 0 :(得分:10)

  

在上面的代码示例中,html位于捕获组中。为什么它仍然包含在结果数组中?

因为这是完全匹配。当他说“但不包括捕获组”时,他并不意味着完全匹配结果,只是捕获组的内容不是在数组中重复。如果包含捕获组,您将看到

// The result is
// [0] <html>
// [1]           // From the capture group; nothing here
// [2] html      // From the capture group
// [3]           // From the capture group; nothing here
// ...
  

和/在同一个捕获组中。为什么它包含在结果数组中?

出于与上述相同的原因:它是整体匹配的一部分,这就是结果中的内容;个别捕获组的内容不是。

使用更简单的示例更容易理解。请考虑以下代码:

var s = "test1 test2";
var re = /(test)(.)/g;
var r = s.match(re);
var i;
for (i = 0; i < r.length; ++i) {
    console.log("[" + i + "]: '" + r[i] + "'");
}

因为正则表达式具有g标志,所以只有完整匹配包含在数组中,因此我们看到:

[0]: 'test1'
[1]: 'test2'

在每种情况下,数组中的条目都是完全匹配,其中包括构成整体表达式的捕获组中匹配的字符。

如果我们删除了g标记但没有更改其他内容,我们将获得第一个完整匹配,然后是两个捕获组的内容:

[0]: 'test1'    // The full match, including the stuff from each capture group
[1]: 'test'     // Capture group 0's contents
[2]: '1'        // Capture group 1's contents

在那里,第一个条目是完全匹配;然后第二个和第三个是捕获组的内容。请注意捕获的内容

答案 1 :(得分:0)

g修饰符是全局应用正则表达式。没有它,正则表达式匹配并返回找到的第一个匹配项。有了它,它会搜索并匹配字符串中的所有匹配项。