0

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

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

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

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

4

5 回答 5

1

+ 运算符是贪婪的。/(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:

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

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

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

于 2012-11-30T18:05:37.370 回答
1

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

这里用粗体表示:/QQ(x\w)+QQ/ g

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

匹配是一个数组

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

于 2012-11-30T18:06:13.033 回答
0

如果要捕获所有组,请使用以下命令:

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

输出 :

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

我做了两个改变:

  • 删除了+你似乎想要的每个 x 后跟一个 char
  • 添加g修饰符以要求所有组

参考


编辑:如果你想要的是只在 QQ 和 QQ 之间获得匹配,你可以这样做:

var matches = str.split('QQ').filter(function(v,i){return i%2})
    .join(' ').match(/(x\w)/g)
于 2012-11-30T17:59:59.707 回答
0
'xaxbxc'.match(/x\w/g);

返回

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

由于OP改变了问题。现在它是JavaScript 正则表达式和子匹配的重复。

于 2012-11-30T18:01:53.850 回答
0

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

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

这返回"xaxbxc"matches[1]

于 2012-11-30T18:03:44.573 回答