我正在制作一个用于搜索相当有限的单词词典(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
匹配 aunt 和 active volcanoa*t
只匹配 aunta*ti
只匹配活火山
#3 不应该也匹配 active in active volcano 吗?
我用其他类似的词组看到了同样的结果。我试图找出具体问题,但我终究无法弄清楚它是什么。
问题:有人可以解释为什么 #3 没有返回“活火山”,我可以做些什么来解决这种行为?
顺便说一句,我希望它是非贪婪的,但为了防止出现问题,我在使用和不使用 ?
的情况下都进行了测试。两者都返回了上面相同的不一致结果。
最佳答案
new RegExp(wildcardified, "gi");
中的 g
修饰符给您带来了麻烦。有关说明和解决方法,请参阅 Why does the "g" modifier give different results when test() is called twice?
关于Javascript 通配符正则表达式搜索给出不一致的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8943488/