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:那么,根据这种逻辑,“冠军”匹配根据您的用例是完全合理的。