【问题标题】:How do I quantify a group in Javascript's regex? [duplicate]如何量化 Javascript 正则表达式中的组? [复制]
【发布时间】:2012-11-18 23:46:36
【问题描述】:

假设我有一个字符串“QQxaxbxcQQ”,我想捕获所有 x 组,然后是任何字符。我也只想在QQ之间搜索(字符串中可能包含其他内容)。我认为这会奏效:

var matches = str.match(/QQ(x\w)+QQ/)

但是,这似乎只返回给我最后一场比赛 (xc)。你能指出我正确的方向吗?

编辑:我的问题的第一个版本过于简单化了。向原始响应者道歉。编辑以使其更接近我的实际问题。

【问题讨论】:

    标签: javascript regex regex-group quantifiers


    【解决方案1】:

    + 运算符是贪婪的。 /(x\w)+/ 应该匹配整个字符串'xaxbxc',并且捕获组将包含最终值以匹配(x\w) 组件。在这种情况下'xc'。如果您希望捕获每个连续匹配,/(x\w)+/ 应改为/((?:x\w)+)/。这会在序列周围而不是在序列内部移动捕获组。 (?: ) 代表非捕获组。

    编辑:

    如果您想要 (x\w) 的每个实例,而不仅仅是连续实例,请不要使用 + 运算符或捕获组。只需使用全局正则表达式:/x\w/g

    'QQxaxbQQxcQQ'.match(/x\w/g) 产生['xa, 'xb', 'xc']

    'QQxaxbQQxcQQ'.match(/((?:x\w)+)/) 产生['xaxb', 'xaxb']

    编辑 2:

    如果您只想在QQs 之间进行搜索,split 应该是最快的方法。 (下划线在这里很有帮助。)

    _.chain('xyQQxaxbQQxcQQxr'.split('QQ'))
    .slice(1, -1)
    .map(function (string) {
        return string.match(/x\w/g);
    })
    .flatten()
    .compact()
    .value()
    

    产量 ['xa', 'xb', 'xc']

    【讨论】:

      【解决方案2】:

      您只需要在您的正则表达式末尾添加g 参数。 g 标志返回一个包含所有匹配项的数组,在我们的例子中,所有匹配项都是反向引用(x\w)

      这里加粗:/QQ(x\w)+QQ/g

      var matches = str.match(/QQ(x\w)+QQ/g)
      

      matches 是一个数组

      看看这个:http://jsfiddle.net/SZRSA/3/

      【讨论】:

      • 告诉我,它返回什么?
      • 它是一个数组。顺便说一句,你的问题在我更新之前就到了:)
      【解决方案3】:
      'xaxbxc'.match(/x\w/g);
      

      返回

      ["xa", "xb", "xc"]
      

      由于 OP 改变了问题。现在它是 JavaScript regular expressions and sub-matches 的重复。

      【讨论】:

        【解决方案4】:

        也许您想要将重复包装在捕获组中(捕获连接在一起的所有x\w 实例):

        var matches = str.match(/QQ((x\w)+)QQ/)
        

        这会将"xaxbxc" 返回为matches[1]

        【讨论】:

          【解决方案5】:

          如果要捕获所有组,请使用:

          var matches = str.match(/(x\w)/g)
          

          输出:

          ["xa", "xb", "xc"]
          

          我做了两个改变:

          • 删除了+,因为您似乎希望每个 x 后跟一个字符
          • 添加了g 修饰符以请求所有组

          Reference


          编辑:如果您只想在 QQ 和 QQ 之间获取匹配项,您可以这样做:

          var matches = str.split('QQ').filter(function(v,i){return i%2})
              .join(' ').match(/(x\w)/g)
          

          【讨论】:

          • 抱歉,我意识到我的问题过于简单化了。我编辑了,你能再看看吗?
          • @user200814 我不知道为什么我的答案对你不起作用。它没有给你想要的吗?
          猜你喜欢
          • 1970-01-01
          • 2012-12-30
          • 1970-01-01
          • 2014-05-29
          • 2022-01-04
          • 1970-01-01
          • 2013-07-29
          相关资源
          最近更新 更多