Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.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 当regexp与空字符串匹配时,是否可以用regexp.exec循环模拟string.match?_Javascript_Regex_String_Match - Fatal编程技术网

Javascript 当regexp与空字符串匹配时,是否可以用regexp.exec循环模拟string.match?

Javascript 当regexp与空字符串匹配时,是否可以用regexp.exec循环模拟string.match?,javascript,regex,string,match,Javascript,Regex,String,Match,众所周知,RegExps中的exec方法可用于查找字符串中的所有匹配项。然而,我刚刚发现,如果regexp与空字符串匹配,这个循环可能会永远卡住 var s = '1234' var r = /()/g; var m; var i = 0; while( (m = r.exec(s)) ){ console.log(i, m[0]); if(++i >= 50){ console.log("infinite loop!"); break } } 但真正奇怪的是,普通的stri

众所周知,RegExps中的exec方法可用于查找字符串中的所有匹配项。然而,我刚刚发现,如果regexp与空字符串匹配,这个循环可能会永远卡住

var s = '1234'
var r = /()/g;
var m;
var i = 0;
while( (m = r.exec(s)) ){
   console.log(i, m[0]);
   if(++i >= 50){ console.log("infinite loop!"); break }
}
但真正奇怪的是,普通的string.match方法没有被卡住:

'1234'.match(/()/g) // Gives ["", "", "", "", "", ""]
我想知道match方法是如何定义为与exec循环不同的工作方式的。到目前为止,我发现的避免像match方法那样陷入困境的唯一方法是滥用string.replace方法

var matches = [];
'1234'.replace(/()/g, function(m){ matches.push(m) });
所以我的问题是:


当regexp匹配空字符串时,match和replace如何返回有限的结果?我可以使用相同的技术来避免陷入exec循环吗?

这不只是比较运算符的问题吗

while(m === r.exec(s)){
或者是凌晨3点

一个(icky)解决方案是确保它与上次不在同一个位置:

var s = '1234'
var r = /()/g;
var m;
var i = 0;
var lastPosition = -1;

while(m = r.exec(s)) {
    if(m.index === lastPosition) {
        r.lastIndex++;
        continue;
    }

    lastPosition = m.index;

    console.log(i, m[0]);
}

这项任务是故意的。Exec返回一个匹配和子匹配的数组,直到您完成所有匹配,它返回null。不过,我添加了一组额外的括号以使这一点更清楚。while((m=r.exec(s))&&m[I]!=null){问题是exec在不前进的情况下一遍又一遍地报告相同的匹配。如果您将regexp更改为类似于
/\d/
的内容,并且将m[I]的内容更改为!=空检查是多余的,因为空在Javascript中是错误的。很高兴听到这一点,是时候让我崩溃了O7为什么你要尝试匹配这样一个无用的模式?@Pointy:可能是用户输入…或者可能有一些有效的理由匹配,例如,
/[a-z]*/
而不是
/[a-z]+/
…我不太确定。@Pointy:这是为我的一个函数设计的,该函数动态构建一个正则表达式,它是一组sugregex的交替。在测试过程中,我意识到我不知道在这个特殊的情况下该怎么办。minitech是对的-它最终归结为用户输入。这在S中的某个地方有记录吗但是tring.match规范?我担心像这样的临时黑客不一定在所有情况下都有相同的行为…@missingno:in
String.match
?不,我不知道
String.match
@missingno:如果你是说
索引
,是的,这是有文档记录的,应该可以用的。关于递增
lastIndex
,我必须检查一下。我做了更多的搜索,结果发现这也正是它在幕后的工作方式。参见步骤8.iii哇,幸运猜测:D和我检查过,它似乎也没有兼容性问题-谁会想到?