Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.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 while循环中的Regex exec即使存在匹配项也返回null_Javascript_Regex_While Loop_Do While - Fatal编程技术网

Javascript while循环中的Regex exec即使存在匹配项也返回null

Javascript while循环中的Regex exec即使存在匹配项也返回null,javascript,regex,while-loop,do-while,Javascript,Regex,While Loop,Do While,根据我的研究,regexreplace不是异步的。所以我有点困惑,为什么在do中匹配和替换,而循环有时无法匹配 我在下面创建了一个代码段,如果值中有匹配项,可以选择“双重检查”,但我不知道为什么双重检查实际上会阻止它忽略匹配项 您将在控制台中看到,当在do while循环中运行两次injectableRegex.exec()时,它会正确地替换所有匹配项 Update:即使这种方法也不一致,因为我发现有时候doubleCheck部分正确匹配,然后后续的exec调用失败 const getInje

根据我的研究,regex
replace
不是异步的。所以我有点困惑,为什么在
do中匹配和替换,而
循环有时无法匹配

我在下面创建了一个代码段,如果值中有匹配项,可以选择“双重检查”,但我不知道为什么双重检查实际上会阻止它忽略匹配项

您将在控制台中看到,当在
do while
循环中运行两次
injectableRegex.exec()
时,它会正确地替换所有匹配项

Update:即使这种方法也不一致,因为我发现有时候doubleCheck部分正确匹配,然后后续的
exec
调用失败

const getInjectedPhase=(短语、注入、双重检查)=>{
让值=短语;
//只需要尝试替换短语中的注射剂,我们已经通过注射剂
如果(插入和短语长度>1){
const injectableRegex=/{\s?([\w-]+)\s?}}/g;//找到任何匹配的可注入项,并提取其密钥
让我们比赛;
window.console.log('初始短语:',短语);
//检查字典值是否包含可注入节,即被{{}包围的节
做{
//为什么这是一件事!?
如果(双重检查){
injectableRegex.exec(值)
}
match=injectableRegex.exec(值);
如果(匹配){
/*
匹配[0]->{x}
匹配[1]->x
*/
常量injectionValue=注入[匹配[1]];
常量injectionValueType=injectionValue的类型;
如果(
injectionValueType==“字符串”||
injectionValueType==“数字”
) {
//用注入的值全局替换该值
value=value.replace(新的RegExp(匹配[0],“g”),`${injectionValue}`);
window.console.log('部分替换短语:',值);
}
}
}while(匹配!==null);
}
log('返回短语:',值);
返回值;
};
window.console.log('没有双重检查');
GetInjectedPhase(
“foo{{{partialCount}}个{{count}}条”{
部分账户:3,
计数:4
},
假的
);
window.console.log('使用双重检查');
GetInjectedPhase(
“foo{{{partialCount}}个{{count}}条”{
部分账户:3,
计数:4
},
真的

);问题在于正则表达式保留了一个
lastIndex
属性,该属性跟踪最后一个匹配的结束索引。在

foo {{partialCount}} of {{count}} bars
匹配

{{partialCount}}
结果将
lastIndex
属性设置为
20
之后-第二个
}
之后的位置

然后,当您将字符串重新指定给

foo 3 of {{count}} bars
使用相同的正则表达式尝试匹配将从该字符串的索引20开始,该索引超过
{{count}
部分,因此匹配失败

一个选项是每次手动将
lastIndex
重置为0:

const getInjectedPhase=(短语、注入、双重检查)=>{
让值=短语;
//只需要尝试替换短语中的注射剂,我们已经通过注射剂
如果(插入和短语长度>1){
const injectableRegex=/{\s?([\w-]+)\s?}}/g;//找到任何匹配的可注入项,并提取其密钥
让我们比赛;
window.console.log('初始短语:',短语);
//检查字典值是否包含可注入节,即被{{}包围的节
做{
injectableRegex.lastIndex=0;
match=injectableRegex.exec(值);
如果(匹配){
/*
匹配[0]->{x}
匹配[1]->x
*/
常量injectionValue=注入[匹配[1]];
常量injectionValueType=injectionValue的类型;
如果(
injectionValueType==“字符串”||
injectionValueType==“数字”
) {
//用注入的值全局替换该值
value=value.replace(新的RegExp(匹配[0],“g”),`${injectionValue}`);
window.console.log('部分替换短语:',值);
}
}
}while(匹配!==null);
}
log('返回短语:',值);
返回值;
};
window.console.log('没有双重检查');
GetInjectedPhase(
“foo{{{partialCount}}个{{count}}条”{
部分账户:3,
计数:4
},
假的

);