这是我的函数代码的第一部分:
var pattern = new RegExp(myTypedString,"gi");
目标是在文本字段中输入时填充结果。每次触发输入事件时,我都会遍历一个字符串数组,并使用以下代码检查我的字符串数组中是否存在我的类型字符串:
return pattern.test(myArrayString);
但幸运的是,我已经意识到其中一个结果是错误的,而且只发生在这个特殊情况下:当我输入" t"或" T"我不会在特拉法加广场和#34; (来自myArrayString的一个字符串),所以我在控制台中进行了一些调试,当我检查变量模式console.log(pattern)
时,它会输出这个字符串:/t/gi
,我认为它是我的地方问题依赖......(后来就此)
当我尝试复制问题时输入:
var pattern = new RegExp('t',"gi")
和
pattern.test('Trafalgar Square')
在第一次尝试时给了我true
,但是......如果我再次输入这个:
pattern.test('Trafalgar Square')
结果将是false
,如果我继续,true
,false
,true
,false
,...
我想到的第一件事就是正则表达式/t
中的/t/gi
可能是一个规则,但我找不到任何相关内容。
我想知道这个意外结果的解释,但我也担心我的功能不完美,所以我问你我该如何改进这个功能?感谢
答案 0 :(得分:4)
它在true
和false
之间交替显示,因为它与第一次匹配(true
),然后尝试第二次匹配,由于Trafalgar Square
中只有一个T,因此失败。当你再次调用它时,它会循环回来,因此true
,false
,true
等等。
要解决此问题,请在匹配前更新其光标:
var p = new Regexp('t', 'gi') // same as `p = /t/gi`
// ...
p.lastIndex = 0;
p.test("Trafalgar Square"); // true
// try again:
p.lastIndex = 0;
p.test("Trafalgar Square"); // true -> it works
以下是一个相关的jsfiddle,其中包含几个示例。
答案 1 :(得分:1)
我不知道为什么它在真假之间交替(我也可以重现它)。 /t/
在正则表达式中不应该是特殊的。它不是{
或\
或[
这样的特殊字符,应该只是一个字面字符。
但你可以使用另一个功能来实现或多或少的相同:
'Trafalgar Square'.match(pattern)
=> Array [ "T" ]
'lalala'.match(pattern)
=> null
匹配比测试需要更多的资源,但这通常不是问题。结果将是一个匹配的数组,或者当没有匹配时为null,所以你可以返回它,其余的代码可能会正常工作。 Array ...将是 truthy 值,null将是 falsy 值。