我正在创建一个用于搜索相当有限的单词词典(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标记中的值,这是各种输入所发生的情况:
a*
匹配所有三个a*n
匹配阿姨和活火山 a*t
仅匹配阿姨 a*ti
仅匹配活火山 #3是否也不符合活火山中的行为?
我看到与其他类似词汇相同的结果。我试图孤立具体问题,但我不能为我的生活弄清楚它是什么。
问题:有人可以解释为什么#3没有返回“活火山”,我能做些什么来解决这种行为?
顺便说一下,我希望它不是贪婪的,但是如果这是问题,我在使用和不使用?
时进行了测试。两者都返回了上面相同的不一致结果。
答案 0 :(得分:4)
g
中的new RegExp(wildcardified, "gi");
修饰符会导致您遇到麻烦。有关解释和解决方法,请参阅Why does the "g" modifier give different results when test() is called twice?