如何量化Javascript正则表达式中的组?

时间:2012-11-30 17:59:12

标签: javascript regex regex-group quantifiers

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

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

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

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

5 个答案:

答案 0 :(得分: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:

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

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

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

答案 1 :(得分:1)

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

以粗体显示:/ QQ(x \ w)+ QQ / g

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

matches是一个数组

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

答案 2 :(得分:0)

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

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)

答案 3 :(得分:0)

'xaxbxc'.match(/x\w/g);

返回

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

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

答案 4 :(得分:0)

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

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

这会将"xaxbxc"作为matches[1]

返回