假设我有一个字符串"QQxaxbxcQQ",我想捕获所有x组,后跟任何字符。 我也只想在QQ之间搜索(字符串中可能包含其他内容)。 我以为这会起作用:
var matches = str.match(/QQ(xw)+QQ/)
然而,这似乎只回到了最后一场比赛(xc)的我身上。 你能指出我正确的方向吗?
编辑:我的问题的第一个版本过于简单化。 向原始回复者道歉。 经过编辑以使其更接近我的实际问题。
+ 运算符很贪婪。 /(xw)+/
应匹配整个字符串'xaxbxc'
,并且捕获组将包含与(xw)
组件匹配的最终值。在这种情况下'xc'
.如果您希望捕获每个连续的匹配项,则应改为/(xw)+/
/((?:xw)+)/
。这会在序列周围移动捕获组,而不是在序列内部移动。(?: )
表示非捕获组。
编辑:
如果要(xw)
的每个实例,而不仅仅是连续的实例,请不要使用 + 运算符或捕获组。只需使用全局正则表达式:/xw/g
.
'QQxaxbQQxcQQ'.match(/xw/g)
产生['xa, 'xb', 'xc']
.
'QQxaxbQQxcQQ'.match(/((?:xw)+)/)
产生['xaxb', 'xaxb']
.
编辑2:
如果您只想在QQ
之间搜索,split
应该是最快的方法。(下划线在这里有很大帮助。
_.chain('xyQQxaxbQQxcQQxr'.split('QQ'))
.slice(1, -1)
.map(function (string) {
return string.match(/xw/g);
})
.flatten()
.compact()
.value()
产生 ["xa"、"xb"、"xc"]
您只需要在正则表达式末尾添加g
参数。 g
标志返回一个包含所有匹配项的数组,在本例中为反向引用的所有匹配项(xw)
此处以粗体显示:/QQ(x\w)+QQ/g
var matches = str.match(/QQ(xw)+QQ/g)
匹配是一个数组
看看这个: http://jsfiddle.net/SZRSA/3/
'xaxbxc'.match(/xw/g);
返回
["xa", "xb", "xc"]
现在它是JavaScript正则表达式和子匹配的重复。
重复包装在捕获组中是您想要的(捕获连接在一起xw
的所有实例):
var matches = str.match(/QQ((xw)+)QQ/)
这会将"xaxbxc"
返回为matches[1]
捕获所有组,请使用以下命令:
var matches = str.match(/(xw)/g)
输出:
["xa", "xb", "xc"]
我做了两个更改:
- 删除了
+
,因为您似乎希望每个 x 后跟一个字符 - 添加了
g
修饰符以请求所有组
参考
编辑:如果你想要的是只在QQ和QQ之间时获得你的匹配,你可以这样做:
var matches = str.split('QQ').filter(function(v,i){return i%2})
.join(' ').match(/(xw)/g)