假设我有一个字符串“QQxaxbxcQQ”,我希望捕获所有x组后跟任何字符。我也只想在QQ之间搜索(字符串中可能包含其他内容)。我认为这会有效:
var matches = str.match(/QQ(x\w)+QQ/)
然而,这似乎只是回到了我的最后一场比赛(xc)。你能指出我正确的方向吗?
编辑:我的问题的第一个版本过于简单了。向原始响应者道歉。编辑使其更接近我的实际问题。答案 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是一个数组
答案 2 :(得分:0)
如果要捕获所有组,请使用:
var matches = str.match(/(x\w)/g)
输出:
["xa", "xb", "xc"]
我做了两处修改:
+
,因为您似乎希望每个x后跟一个字符g
修饰符以询问所有群组编辑:如果你想要的只是在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]