Javascript while循环中的Regex exec即使存在匹配项也返回null
根据我的研究,regexJavascript 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
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
},
假的
);我知道我一定错过了一些非常明显的东西!这是一个有趣的关于lastIndex的问题。非常感谢,当它让我在3分钟内回答时将标记为答案。同样,非常感谢更简单的替换功能!