gpt4 book ai didi

javascript - RegExp.test() 根据调用方式(在哪里?)为相同的 str 返回不同的结果

转载 作者:数据小太阳 更新时间:2023-10-29 04:23:20 24 4
gpt4 key购买 nike

我刚刚注意到一个奇怪的 JS 行为导致了一个烦人的错误..

基本上,我在 if 语句中使用 RegExp 对象(.test() 方法)测试 str。对于相同的测试字符串,如果在我的代码中只有一个 if,则 regexp.test() 返回 true 并且可以正常进入 if。

问题是如果我有一个 else(我需要它),出于某种原因,对于相同的 str 测试,regexp.test() 返回 false 并且它转到 else...

这是什么行为?

我已经运行了很多测试...

TL/DR:对于在同一个 RegExp 上测试的同一个字符串,如果只有一个 IF 语句,则 regexp.test() 返回 true,但如果我有一个 else,它返回 false。

some code

我忘了说这个错误并不是所有的单词都会出现..

http://jsfiddle.net/zrwkU/13/

在文本字段中输入单词“armoire”,然后按回车键。这个 jsfiddle 有“else return false”但没有任何反应。

删除 searchDeeper 函数 ( if (regexp.test(tested)){ ) 中的“else return false”并再次进行测试。现在它进入 if 和 msgbox 弹出窗口。

最佳答案

/regex/g.lastIndex = 0

模式具有全局'g' 标志集,RegExp 方法; test()exec() 跟踪它们匹配的最后一个位置,并将此整数存储在 RegExp 对象的:lastIndex 属性中。当每个匹配应用于任何 字符串时,该索引会自动推进。请注意,test()exec() 都以这种方式运行。一旦任何匹配失败,最后一个索引属性将自动重置为零。您也可以自己手动将其重置为零,看起来这就是您需要在此处执行的操作。添加一行以重置 RegExp.lastIndex,如下所示:

if (regexp != null){
regexp.lastIndex = 0;
if (regexp.test(tested)){
alert('ok');
regexp.lastIndex = 0;
var res = regexp.exec(tested);
tested = tested.replace(res, '<span class="underlined">' + res + '</span>');
}else{
return false;
}
}

这是另一种解决方案,它完全避免了这个last-index-issue。它使用 String.match() 方法代替:

String.match() 替代方案:

if (regexp != null){
if (tested.match(regexp)){
alert('ok');
regexp.lastIndex = 0;
var res = tested.match(regexp);
tested = tested.replace(res, '<span class="underlined">' + res + '</span>');
}else{
return false;
}
}

关于javascript - RegExp.test() 根据调用方式(在哪里?)为相同的 str 返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13586786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com