假设我有一个字符串“QQxaxbxcQQ”,我想捕获所有 x 组,后跟任何字符。我也只想在QQ之间搜索(字符串中可能包含其他内容)。我认为这会奏效:
var matches = str.match(/QQ(x\w)+QQ/)
然而,这似乎只是让我回到最后一场比赛(xc)。你能为我指出正确的方向吗?
编辑:我的问题的第一个版本过于简单化了。向原始响应者道歉。编辑以使其更接近我的实际问题。
假设我有一个字符串“QQxaxbxcQQ”,我想捕获所有 x 组,后跟任何字符。我也只想在QQ之间搜索(字符串中可能包含其他内容)。我认为这会奏效:
var matches = str.match(/QQ(x\w)+QQ/)
然而,这似乎只是让我回到最后一场比赛(xc)。你能为我指出正确的方向吗?
编辑:我的问题的第一个版本过于简单化了。向原始响应者道歉。编辑以使其更接近我的实际问题。
+ 运算符是贪婪的。/(x\w)+/
应该匹配整个 string '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
s 之间搜索,asplit
应该是最快的方法。(下划线在这里很有帮助。)
_.chain('xyQQxaxbQQxcQQxr'.split('QQ'))
.slice(1, -1)
.map(function (string) {
return string.match(/x\w/g);
})
.flatten()
.compact()
.value()
产生 ['xa', 'xb', 'xc']
您只需要g
在正则表达式末尾添加参数。g
flag 返回一个包含所有匹配项的数组,在我们的例子中是反向引用的所有匹配项(x\w)
这里用粗体表示:/QQ(x\w)+QQ/ g
var matches = str.match(/QQ(x\w)+QQ/g)
匹配是一个数组
看看这个:http: //jsfiddle.net/SZRSA/3/
如果要捕获所有组,请使用以下命令:
var matches = str.match(/(x\w)/g)
输出 :
["xa", "xb", "xc"]
我做了两个改变:
+
你似乎想要的每个 x 后跟一个 charg
修饰符以要求所有组编辑:如果你想要的是只在 QQ 和 QQ 之间获得匹配,你可以这样做:
var matches = str.split('QQ').filter(function(v,i){return i%2})
.join(' ').match(/(x\w)/g)
也许将重复包装在捕获组中是您想要的(捕获x\w
连接在一起的所有实例):
var matches = str.match(/QQ((x\w)+)QQ/)
这返回"xaxbxc"
为matches[1]