Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让正则表达式在javascript中查找所有匹配项?_Javascript_Regex - Fatal编程技术网

如何让正则表达式在javascript中查找所有匹配项?

如何让正则表达式在javascript中查找所有匹配项?,javascript,regex,Javascript,Regex,如果我运行这个: '121'.match(/[0-9]{2}/gi) 我返回一个数组,结果只有一个: ['12'] 我如何让它返回所有结果,即使它们重叠?我希望结果是: ['12', '21'] 编辑:或者更好的例子是: '1234567'.match(...); 应该给我一个数组 [12, 23, 34, 45, 56, 67]这不会按你想要的方式工作 当您指定模式[0-9]{2}时,match()查找第一个出现的两位数,然后从该位置继续搜索。由于字符串长度为3,显然它找不到其他匹配项

如果我运行这个:

'121'.match(/[0-9]{2}/gi)
我返回一个数组,结果只有一个:

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

['12', '21']
编辑:或者更好的例子是:

'1234567'.match(...);
应该给我一个数组

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

这不会按你想要的方式工作

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

您应该使用不同的算法来查找所有两位数。我建议使用您的第一个匹配的组合,并用下面的正则表达式再做一个


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

它不是很简洁,但这:

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

匹配设置为
['12'、'23'、'34'、'45'、'56'、'67']
。它的工作原理是使用前瞻性断言来查找匹配项,而不实际吞咽它们。(在这种情况下,
replace
实际上并不替换任何内容;它只是一种方便的方法,可以将闭包应用于给定字符串中正则表达式匹配的所有实例。)

您可以这样做:

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
值,以便它从您希望它再次查看的位置开始

您可以看到它在这里工作:

您可以在此处了解多次调用
.exec()
的工作原理:

功能元素(id){
返回文档.getElementById(id);
}
功能测试(){
var str=元素(“数据”)。值;
var结果=[];
var re=/[0-9]{2}/gi,
比赛;
while(matches=re.exec(str)){
结果:推送(匹配[0]);
re.lastIndex-=(匹配[0]。长度-1);
}
elem(“result”).innerHTML=results.join(“
”); } 元素(“go”)。onclick=测试

试验
下面是另一个使用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的想法相同,但方法略有不同。

这适用于大多数pcre发动机。
捕获2,消耗1

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

var pat=/(?=(\d\d))\d/g;
var结果=[];
var匹配;
while((match=pat.exec('1234567'))!=null){
结果:推(匹配[1]);
}

控制台日志(结果)我试图从该字符串中同时得到'12'和'21'。相反,我只得到'12',因为正则表达式引擎在找到匹配项后停止。