Javascript Regex - 查找所有可能的匹配项,即使在已捕获的匹配项中也是如此

Vin*_*ent 15 javascript regex string match

我正在尝试使用带有javascript的正则表达式从字符串中获取所有可能的匹配项.看来我的方法不匹配已匹配的字符串部分.

变量:

var string = 'A1B1Y:A1B2Y:A1B3Y:A1B4Z:A1B5Y:A1B6Y:A1B7Y:A1B8Z:A1B9Y:A1B10Y:A1B11Y';

var reg = /A[0-9]+B[0-9]+Y:A[0-9]+B[0-9]+Y/g;
Run Code Online (Sandbox Code Playgroud)

码:

var match = string.match(reg);
Run Code Online (Sandbox Code Playgroud)

我得到的所有匹配结果:

A1B1Y:A1B2Y
A1B5Y:A1B6Y
A1B9Y:A1B10Y
Run Code Online (Sandbox Code Playgroud)

我想要的匹配结果:

A1B1Y:A1B2Y
A1B2Y:A1B3Y
A1B5Y:A1B6Y
A1B6Y:A1B7Y
A1B9Y:A1B10Y
A1B10Y:A1B11Y
Run Code Online (Sandbox Code Playgroud)

在我的脑海中,我想A1B1Y:A1B2Y成为一个匹配A1B2Y:A1B3Y,即使A1B2Y在字符串中需要成为两个匹配的一部分.

Fab*_*tté 23

在不修改正则表达式的情况下,可以将其设置为在每次匹配后的匹配的后半部分开始时使用.exec和操作正则表达式对象的lastIndex属性开始匹配.

var string = 'A1B1Y:A1B2Y:A1B3Y:A1B4Z:A1B5Y:A1B6Y:A1B7Y:A1B8Z:A1B9Y:A1B10Y:A1B11Y';
var reg = /A[0-9]+B[0-9]+Y:A[0-9]+B[0-9]+Y/g;
var matches = [], found;
while (found = reg.exec(string)) {
    matches.push(found[0]);
    reg.lastIndex -= found[0].split(':')[1].length;
}

console.log(matches);
//["A1B1Y:A1B2Y", "A1B2Y:A1B3Y", "A1B5Y:A1B6Y", "A1B6Y:A1B7Y", "A1B9Y:A1B10Y", "A1B10Y:A1B11Y"]
Run Code Online (Sandbox Code Playgroud)

演示


根据Bergi的评论,你也可以获得最后一场比赛的索引,并将其增加1,这样它不会从比赛的后半段开始匹配,它将开始尝试从每场比赛的第二个角色开始匹配:

reg.lastIndex = found.index+1;
Run Code Online (Sandbox Code Playgroud)

演示

最终结果是一样的.虽然,Bergi的更新代码少了一些,但执行速度稍快.=]

  • 很好,这比前瞻,捕获组等要好得多.顺便说一下,`reg.lastIndex = found.index + 1;`应该足够让它与表达式无关 (2认同)