我该如何修复这个正则表达式函数?

时间:2014-07-12 12:56:53

标签: javascript regex string

这是我的函数代码的第一部分:

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,如果我继续,truefalsetruefalse,...

我想到的第一件事就是正则表达式/t中的/t/gi可能是一个规则,但我找不到任何相关内容。

我想知道这个意外结果的解释,但我也担心我的功能不完美,所以我问你我该如何改进这个功能?感谢

2 个答案:

答案 0 :(得分:4)

它在truefalse之间交替显示,因为它与第一次匹配(true),然后尝试第二次匹配,由于Trafalgar Square中只有一个T,因此失败。当你再次调用它时,它会循环回来,因此truefalsetrue等等。

要解决此问题,请在匹配前更新其光标:

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 值。