2011-04-12 17 views
0

我有一個RegExp的Javascript正則表達式匹配的怪事

/.?(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! 
} 

必須有我的正則表達式什麼不對,對不對?

編輯: .?事情只是一個快速和骯髒的嘗試說,我想匹配其中一個單詞和/或這些單詞之一與單一字符在任何一方。例如:

\sNCAA\s 
NCAA 
NCAA\s 
\sNCAA 

目標: 我試圖做一些簡單的詞突出顯示基於某些搜索詞。我有一個函數可以獲取頁面上的所有文本節點,並且我希望通過它們來突出顯示我的phrase變量中任何術語的匹配。

我認爲我只需要重新建立我的RegExp。

+0

'pat'是一個RexExp對象還是一個字符串?在你的代碼中,它是一個字符串。 – 2011-04-12 14:08:03

+0

@Matt它實際上是一個RegExp,讓我修復代碼...我認爲這兩種方式都有效,不是嗎? – samandmoore 2011-04-12 14:10:29

+0

你從來沒有真正指出你想要發生什麼或你期望在這裏發生什麼。現在它不是那麼明顯。 – Groovetrain 2011-04-12 14:17:59

回答

1

Champion匹配/.?I.?/i

你自己的輸出注意到它匹配子字符串「pio」。

也許你的意思是綁定的表達式的開始和輸入結束,用^$分別爲:

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

我知道你說忽略.?,但我不能:這是最可能是錯的,而且很可能會繼續導致你的問題。解釋他們爲什麼在那裏,我們可以告訴你如何正確地做到這一點。 :)

+0

。 – samandmoore 2011-04-12 14:27:44

+0

@samandmoore:在你的更新中你甚至沒有提及'。?',讓我們來解釋它們的用法。 – 2011-04-12 14:28:41

+0

它的信息已更新,我沒有立即保存,我的壞消息。 – samandmoore 2011-04-12 14:31:28

2

將開始(^)和結束($)錨定添加到正則表達式。

/^.?(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 
2

嗯,首先你指定不區分大小寫的,其次,你是爲匹配信I你的一個可匹配的字符串。

Champion將匹配pioi,因爲它們都匹配/.?I.?/gi

然而它並沒有因爲後面的逗號的匹配/.?Champions,.?/gi

+0

而且因爲's'。在問題(更新)中解釋了 – 2011-04-12 14:22:57