Javascript 通配符正则表达式搜索给出不一致的结果

标签 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 匹配 auntactive volcano
  3. a*t 只匹配 aunt
  4. a*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/

相关文章:

c++ - boost 正则表达式错误

python - 理解 python 正则表达式

javascript -//@流: Uncaught ReferenceError: number is not defined

javascript - 获取具有特定 data-* 集的元素

javascript - 使用触摸事件在移动浏览器上模拟鼠标悬停的最佳方法是什么?

c# - C#中的正则表达式来检测单词之间的多个空格

regex - 不小心尝试正则表达式数组引用并提取了单词 'linux'

R 忽略正则表达式字符串中的字符

javascript - 安装失败 'cordova-plugin-whitelist' :Error: cmd: Command failed with exit code 1

javascript - 无法弄清楚为什么 angularJS 模块无法加载