【问题标题】:What is the meaning of the 'g' flag in regular expressions?正则表达式中的“g”标志是什么意思?
【发布时间】:2012-10-20 23:36:10
【问题描述】:

正则表达式中g标志的含义是什么?

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

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    g 用于全局搜索。这意味着它将匹配所有事件。您通常还会看到i,这意味着忽略大小写。

    参考:global - JavaScript | MDN

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

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

    【讨论】:

    • 所以 /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】:

    g 是全局搜索标志。

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

    所以/.+/g/.+/ 之间的区别在于g 版本会发现每一个出现而不是第一个出现。

    【讨论】:

      【解决方案4】:

      正如@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 标志,它跳过了很少出现的模式,因为它总是向前移动。你拯救了我的一天。谢谢!
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

        参考:Mozilla Developer Network

        【讨论】:

          【解决方案7】:
          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"] 的数组。

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

              将根据字符串给出示例。如果我们想从一个 细绳。 假设我们要从“hello world”中删除所有出现的“o”和“”

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

              【讨论】:

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