【问题标题】:I can't accurately understand how does JavaScript's method string.match(regexp)'s g flag work我无法准确理解 JavaScript 的方法 string.match(regexp) 的 g 标志是如何工作的
【发布时间】:2012-06-05 16:42:14
【问题描述】:

在“JavaScript: The Good Parts”一书中,它解释了方法string.match(regexp)如下:

match 方法匹配一个字符串和一个正则表达式。如何 这取决于 g 标志。如果没有 g 标志,则 调用 string .match( regexp ) 的结果与调用相同 正则表达式 .exec( 字符串 )。但是,如果正则表达式有 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>

我的问题是我无法理解“但不包括捕获组”。

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

并且&lt;/html&gt; 中的/ 也在捕获组中。为什么会包含在结果数组中?

您能用上面的代码示例解释“但不包括捕获组”吗?

非常感谢!

【问题讨论】:

    标签: javascript regex string match gflags


    【解决方案1】:

    在上面的代码示例中, 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' // 完整匹配,包括来自每个捕获组的内容
    [1]: 'test' // 捕获组 0 的内容
    [2]: '1' // 捕获组 1 的内容

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

    【讨论】:

    • 非常感谢!您的回答正确、详细且有帮助!
    • @WeiLou: :-) 谢谢!很高兴这有帮助。最好的,
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多