Javascript通配符正则表达式搜索会产生不一致的结果

时间:2012-01-20 15:09:37

标签: javascript regex

我正在创建一个用于搜索相当有限的单词词典(2700左右的词条)的界面。这些单词存储在XML文件中:

<root>
    <w>aunt</w>
    <w>active volcano</w>
    <w>Xamoschi</w>
</root>

这是相当基本的 - 用户输入一个字符串,任何匹配都会吐出来。当我想要包含通配符时,问题出现了。如果用户输入带星号的字符串,则每个星号都会被正则表达式替换,以匹配零个或多个字符,这些字符可以是任何字符。

因此,当用户点击搜索时,脚本会循环遍历XML标记,并将每个nodeValue与模式srch进行匹配:

var wildcardified = userinput.replace(/\*/g, ".*?");
var srch = new RegExp(wildcardified, "gi");

//for loop cycles through the xml, and tests with this:
if (srch.test(tag[i].firstChild.nodeValue) {
    //it's a match!
}

在大多数情况下,它的工作方式与我希望的一样。但是我得到了一些我无法解释的不一致的结果。对于上面XML标记中的值,这是各种输入所发生的情况:

  1. a*匹配所有三个
  2. a*n匹配阿姨活火山
  3. a*t仅匹配阿姨
  4. a*ti仅匹配活火山
  5. #3是否也不符合活火山中的行为

    我看到与其他类似词汇相同的结果。我试图孤立具体问题,但我不能为我的生活弄清楚它是什么。

    问题:有人可以解释为什么#3没有返回“活火山”,我能做些什么来解决这种行为?

    顺便说一下,我希望它不是贪婪的,但是如果这是问题,我在使用和不使用?时进行了测试。两者都返回了上面相同的不一致结果。

1 个答案:

答案 0 :(得分:4)

g中的new RegExp(wildcardified, "gi");修饰符会导致您遇到麻烦。有关解释和解决方法,请参阅Why does the "g" modifier give different results when test() is called twice?