Javascript RegExp匹配古怪

Javascript RegExp匹配古怪,javascript,Javascript,我有一个RegExp: /。?(NCAA分区篮球冠军,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|Champi

我有一个
RegExp

/。?(NCAA分区篮球冠军,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的方式。

将start(
^
)和end(
$
)锚添加到RegExp

/^.?(NCAA|Division|I|Basketball|Champions,|1939-2011).?$/gi
没有锚,regexp的匹配可以在字符串中的任何位置开始和结束,这就是为什么

/.?(NCAA|Division|I|Basketball|Champions,|1939-2011).?/gi.exec('Champion')
可以匹配
pio
i
:因为它实际上是围绕(不区分大小写)
i
进行匹配的。如果不使用锚,但删除了
。|I |…
,则正则表达式将不匹配
“Champion”

> /.?(NCAA|Division|Basketball|Champions,|1939-2011).?/gi.exec('Champion')
null
将开始(
^
)和结束(
$
)锚定添加到regexp

/^.?(NCAA|Division|I|Basketball|Champions,|1939-2011).?$/gi
没有锚,regexp的匹配可以在字符串中的任何位置开始和结束,这就是为什么

/.?(NCAA|Division|I|Basketball|Champions,|1939-2011).?/gi.exec('Champion')
可以匹配
pio
i
:因为它实际上是围绕(不区分大小写)
i
进行匹配的。如果不使用锚,但删除了
。|I |…
,则正则表达式将不匹配
“Champion”

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

首先,指定大小写不敏感,其次,将字母
I
匹配为可匹配字符串之一

Champion
将匹配
pio
i
,因为它们都匹配
/.i./gi


但是,由于后面的逗号,它与
/.?Champions、.?/gi
不匹配。

首先指定大小写不敏感,其次,将字母
I
作为可匹配字符串之一进行匹配

Champion
将匹配
pio
i
,因为它们都匹配
/.i./gi


但是,它不匹配
/.?Champions,.?/gi
,因为后面有逗号。

Champion
匹配
/.?I.?/I

您自己的输出注意到它与子字符串“pio”匹配

也许您想将表达式绑定到输入的开始和结束,分别使用
^
$

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

我知道你说过要忽略
,但我不能:这很可能是错误的,而且很可能会继续给你带来问题。解释他们在那里的原因,我们可以告诉您如何正确操作。:)

Champion
匹配
/.I.?/I

您自己的输出注意到它与子字符串“pio”匹配

也许您想将表达式绑定到输入的开始和结束,分别使用
^
$

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


我知道你说过要忽略
,但我不能:这很可能是错误的,而且很可能会继续给你带来问题。解释他们在那里的原因,我们可以告诉您如何正确操作。:)

pat
是RexExp对象还是字符串?在您的代码中,它是一个字符串。@Matt它实际上是一个RegExp,让我来修复代码。。。我认为它是双向的,不是吗?你从来没有真正指定你想要发生什么或者你期望在这里发生什么。现在它不是很明显。这取决于你所说的“它是双向的”是什么意思。如果你能解释一下你试图实现的最终目标,可能会有所帮助,因为这可能是使用
String.split()更好的方法
。让我用我试图完成的内容更新这个问题。
pat
是一个RexExp对象还是一个字符串?在您的代码中,它是一个字符串。@Matt它实际上是一个RegExp,让我来修复代码。。。我认为它是双向的,不是吗?你从来没有真正指定你想要发生什么或者你期望在这里发生什么。现在它不是很明显。这取决于你所说的“它是双向的”是什么意思。如果你能解释一下你试图实现的最终目标,可能会有所帮助,因为这可能是使用
String.split()更好的方法
。让我用我想完成的内容来更新这个问题。@samandmoore:你甚至没有在更新中提到
,让我们解释一下它们的用法。它是用这些信息更新的,我没有立即保存它,我的错。@samandmoore:如果你试图允许两边都有空格,我更喜欢事先从输入字符串中删减这个空格。@Tomalak,但这不会完全起作用,因为我希望在不篡改输入字符串的情况下找到匹配项。目标说明的是,我正在尝试获取一些文本,并在其中突出显示一个匹配项。我希望允许它两边各宽一个字符,即使结果是假阳性。@samandmoore:那么,根据这种逻辑,“冠军”匹配根据您的用例是完全合理的。@samandmoore:您在更新中甚至没有提到
,让我们来解释一下它们的用法。它是用这些信息更新的,我没有马上保存它,我的错。@samandmoore:如果你想允许两边都有空格,最好事先从输入字符串中删掉这些空格。@Tomalak这不会完全起作用,因为我希望在不篡改输入字符串的情况下找到匹配项。目标说明的是,我正在尝试获取一些文本,并在其中突出显示一个匹配项。我希望允许它在两边各宽一个字符,即使结果是假阳性。@samandmoore:那么,根据这种逻辑,“冠军”匹配根据您的用例是完全合理的。