【问题标题】:What is the meaning of the 'g' flag in regular expressions?正则表达式中的 \'g\' 标志是什么意思?
【发布时间】:2022-12-17 00:32:33
【问题描述】:

正则表达式中的g标志是什么意思?

/.+/g/.+/ 有什么区别?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    g 用于全局搜索。这意味着它将匹配所有出现的情况。您通常还会看到 i,表示忽略大小写。

    参考:global - JavaScript | MDN

    “g”标志表示应针对字符串中所有可能的匹配项测试正则表达式。

    如果没有 g 标志,它只会测试第一个。

    此外,请确保检查cchamberlain's answer below 以了解有关如何设置 lastIndex 属性的详细信息,这可能会在针对一系列值重新使用正则表达式时导致意外的副作用。

    【讨论】:

    • 所以 /g 标志在使用 .test 函数时是无关紧要的,因为它无论如何只能找到第一个匹配项,对吧?
    • @xr280xr 不是无关紧要,更像是适得其反。如果您重新使用 RegExp,它会破坏一切。 var r = /a/g; console.log(r.test('a'), r.test('a')); // true false
    【解决方案2】:

    以 Javascript 举例说明:

    > 'aaa'.match(/a/g)
    [ 'a', 'a', 'a' ]
    
    > 'aaa'.match(/a/)
    [ 'a', index: 0, input: 'aaa' ]
    

    【讨论】:

    • 谢谢。我不确定 Javascript 中的正则表达式是否可以像在 PHP 中那样返回一个数组,这证实了这一点。
    【解决方案3】:

    正如@matiska 指出的那样,g 标志也设置了lastIndex 属性。

    这样做的一个非常重要的副作用是,如果您针对匹配的字符串重复使用相同的正则表达式实例,它最终会失败,因为它只在 lastIndex 处开始搜索。

    // regular regex
    const regex = /foo/;
    
    // same regex with global flag
    const regexG = /foo/g;
    
    const str = " foo foo foo ";
    
    const test = (r) => console.log(
        r,
        r.lastIndex,
        r.test(str),
        r.lastIndex
    );
    
    // Test the normal one 4 times (success)
    test(regex);
    test(regex);
    test(regex);
    test(regex);
    
    // Test the global one 4 times
    // (3 passes and a fail)
    test(regexG);
    test(regexG);
    test(regexG);
    test(regexG);

    【讨论】:

    • 在 bug 上花了 3 个小时后,我偶然发现了这个答案。我使用了 /g 标志,它跳过了几次模式,因为它总是向前移动。你救了我的一天。谢谢!
    【解决方案4】:

    g 是全局搜索标志。

    全局搜索标志使 RegExp 在整个字符串中搜索模式,创建它可以找到的与给定模式匹配的所有匹配项的数组。

    所以/.+/g/.+/ 之间的区别是g 版本会找到每一个匹配项,而不仅仅是第一个匹配项。

    【讨论】:

      【解决方案5】:

      /.+/g/.+/ 之间没有区别,因为它们都只会匹配整个字符串一次。如果正则表达式可以匹配多次或包含组,则 g 会有所不同,在这种情况下,.match() 将返回匹配数组而不是组数组。

      【讨论】:

        【解决方案6】:
        1. g -> 返回所有匹配项
        2. without g -> 返回第一个匹配项

          例子:

          1. '1 2 1 5 6 7'.match(/d+/) 返回 ["1", index: 0, input: "1 2 1 5 6 7", groups: undefined]。如您所见,我们只能进行第一场比赛"1"
          2. '1 2 1 5 6 7'.match(/d+/g) 返回所有匹配 ["1", "2", "1", "5", "6", "7"] 的数组。

        【讨论】:

          【解决方案7】:

          除了已经提到的g标志的含义外,它还影响regexp.lastIndex属性:

          lastIndex 是正则表达式的读/写整数属性 指定开始下一场比赛的索引的实例。 (...) 仅当正则表达式实例时才设置此属性 使用“g”标志表示全局搜索。

          参考:Mozilla Developer Network

          【讨论】:

            【解决方案8】:

            正则表达式中的 G 定义了全局搜索,这意味着它将搜索所有行上的所有实例。

            【讨论】:

              【解决方案9】:

              将给出基于字符串的示例。如果我们想从一个 细绳。 让我们说如果我们想从“hello world”中删除所有出现的“o”和“”

              "hello world".replace(/o/g,'');
              

              【讨论】:

                【解决方案10】:

                在我的例子中,我有一个问题,我需要每次从第一个字母开始重新评估字符串,为此必须删除/my_regexp/G(全球标志)停止移动最后索引.

                如 mdn 中所述:

                确保设置了全局 (g) 标志,否则 lastIndex 将永远不会被推进。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec#specifications

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2011-08-28
                  • 2014-03-23
                  • 2011-04-15
                  • 2011-06-15
                  • 2012-06-10
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-09-07
                  相关资源
                  最近更新 更多