我该如何在JavaScript中使用正则表达式来找到所有匹配?

6
如果我运行这个命令:
'121'.match(/[0-9]{2}/gi)

我得到一个只有一个结果的数组:
['12']

如何让它返回所有结果,即使它们重叠?我希望结果是这样的:
['12', '21']

EDIT: 或者更好的例子是:
'1234567'.match(...);

应该给我一个数组,其中包含以下元素: [12, 23, 34, 45, 56, 67]

1
我正在尝试从该字符串中获取'12'和'21' -- 但是我只得到了'12',因为正则表达式引擎在找到匹配项后停止了。 - Nick
5个回答

8

这适用于大多数pcre引擎。
捕获2个数字,只匹配1个。

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

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

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

console.log(results);

输出:12、23、34、45、56、67


3

这种做法无法按照您的意愿进行。

当您指定模式 [0-9]{2} 时,match() 查找第一个两位数,然后从那个位置继续查找。由于字符串长度为 3,很明显它不会找到另一个匹配项。

您应该使用不同的算法来查找所有的两位数。我建议您使用第一个匹配结果和以下正则表达式结合使用:

/[0-9]([0-9]{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

function elem(id) {
    return document.getElementById(id);
}

function test() {
  var str = elem("data").value;
  var results = [];
  var re = /[0-9]{2}/gi,
    matches;
  while (matches = re.exec(str)) {
    results.push(matches[0]);
    re.lastIndex -= (matches[0].length - 1);
  }
  elem("result").innerHTML = results.join("<br>");
}

elem("go").onclick = test;
<input id="data" type="text" value="1234567890"><br>
<button id="go">Test</button>
<div id="result"></div>


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实际上不会替换任何内容; 它只是一种方便的方式,可以将闭包应用于给定字符串中所有正则表达式匹配项的实例。)


1

这里是另一个使用前瞻的示例

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的想法一样,但是方法稍有不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接