Javascript RegExp匹配怪异

时间:2011-04-12 14:05:36

标签: javascript

我有RegExp

/.?(NCAA|Division|I|Basketball|Champions,|1939-2011).?/gi

和一些文字"Champion"

不知何故,这是一场比赛,我疯了吗?

0: "pio"
1: "i"
index: 4
input: "Champion"
length: 2

循环在这里:

// contruct the pattern, dynamically
var someText = "Champion";
var phrase = ".?(NCAA|Division|I|Basketball|Champions,|1939-2011).?";
var pat = new RegExp(phrase, "gi"); // <- ends up being 
var result;

while( result = pat.exec(someText) ) {
     // do stuff!   
}

我的RegExp有问题,对吧?

编辑: .?这件事只是一个快速而肮脏的尝试,表示我希望将这些单词中的一个和/或其中一个单词与任一方的单个字符匹配。例如:

\sNCAA\s
NCAA
NCAA\s
\sNCAA

目标: 我试图根据一些搜索词做一些简单的点击突出显示。我有一个功能可以获取页面上的所有文本节点,我想全部浏览它们并突出显示我phrase变量中任何一个术语的匹配项。< / p>

我认为我只需要重新构建我的RegExp。

3 个答案:

答案 0 :(得分:2)

将start(^)和end($)锚点添加到正则表达式。

/^.?(NCAA|Division|I|Basketball|Champions,|1939-2011).?$/gi

没有锚点,正则表达式的匹配可以在字符串中的任何地方开始和结束,这就是为什么

/.?(NCAA|Division|I|Basketball|Champions,|1939-2011).?/gi.exec('Champion')

可以匹配pioi:因为实际匹配(不区分大小写的)I。如果您关闭锚点但删除...|I|...,则正则表达式将与'Champion'不匹配:

> /.?(NCAA|Division|Basketball|Champions,|1939-2011).?/gi.exec('Champion')
null

答案 1 :(得分:2)

好吧,首先你要指定不区分大小写,其次,你将字母I作为匹配字符串之一。

Champion会匹配pioi,因为它们都匹配/.?I.?/gi

但由于尾随逗号,它与/.?Champions,.?/gi不匹配。

答案 2 :(得分:1)

Champion匹配/.?I.?/i

您自己的输出表明它与子串“pio”匹配。

也许您打算将表达式绑定到输入的开头和结尾,分别使用^$

/^.?(NCAA|Division|I|Basketball|Champions,|1939-2011).?$/gi

我知道你说要忽略.?,但我不能:它很可能是错的,而且很可能会继续引起你的问题。解释他们为什么在那里,我们可以告诉你如何正确地做到这一点。 :)