我怎样才能获得正则表达式来查找javascript中的每个匹配项?

时间:2011-11-23 00:39:18

标签: javascript regex

如果我这样做:

'121'.match(/[0-9]{2}/gi)

我得到一个包含单个结果的数组:

['12']

我怎样才能让它返回所有结果,即使它们重叠?我希望结果如下:

['12', '21']

编辑:或者更好的例子是:

'1234567'.match(...);

应该给我一个

的数组

[12, 23, 34, 45, 56, 67]

5 个答案:

答案 0 :(得分:6)

这适用于大多数pcre引擎 捕获2,消耗1。

/(?=(\d\d))\d/g

我是javascript的新手。这有效:

var pat = /(?=(\d\d))\d/g;
var results = [];
var match;

while ( (match = pat.exec( '1234567' ) ) != null ) { 
  results.push( match[1] );
}

print (results);

产出:12,23,34,45,56,67

答案 1 :(得分:4)

这不会以你想要的方式运作。

当您指定模式[0-9]{2}时,match()会查找第一次出现的两位数字,然后继续从该位置搜索。因为字符串长度是3,显然它不会找到另一个匹配。

您应该使用不同的算法来查找所有两位数字。我建议使用你的第一场比赛的组合,再做一次跟随正则表达式

/[0-9]([0-9]{2})/并组合第一次和第二次运行。

答案 2 :(得分:3)

你可以这样做:

var str = '121';
var results = [];
var re = /[0-9]{2}/gi, matches;
while (matches = re.exec(str)) {
    results.push(matches[0]);
    re.lastIndex -= (matches[0].length - 1);  // one past where it matched before
}
// results is an array of matches here

需要多次调用.exec(),然后您必须操纵.lastIndex值,以便它可以从您想要再次查看的位置开始。

你可以在这里看到它:http://jsfiddle.net/jfriend00/XsNe5/

您可以在此处了解多次调用.exec()的方法:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp/exec

答案 3 :(得分:1)

这不是很简洁,但是这个:

var matches = [];
'1234567'.replace
(
  /(?=[0-9]{2})/gi,
  function(s,pos,str)
  {
    matches.push(str.substr(pos, 2));
  }
);

会将matches设置为['12','23','34','45','56','67']。它通过使用先行断言来查找匹配而不实际吞下它们。 (在这种情况下,replace实际上并不替换任何东西;它只是将闭包应用于给定字符串中所有正则表达式匹配实例的便捷方式。)

答案 4 :(得分:1)

这是使用lookaheads的另一个例子

var str = "12345",
    regexp = /\d(?=(\d))/g,
    results = [],
    m = null;

while(m = regexp.exec(str)) results.push(m.join(''));

alert(results) // 12,23,34,45

与ruakh相同,但方法略有不同。