2012-10-18 24 views
0

當前我正在使用下面的搜索。 我假設用戶類型中的每個術語都必須至少在文章中出現一次。 我使用匹配法正則表達式在javascript中使用正則表達式的基本搜索排名

^(?=.*one)(?=.*two)(?=.*three).*$ 

gi,並m

在我使用matches.length計算匹配的數量的時刻,但並不如預期的行爲。 例如: 「one two three. one two three」 會給我2場比賽,但它確實應該6.

如果我這樣做

(one|two|three) 

然後我得到6場比賽,但如果我有數據:

"one two. one two" 

我得到4個匹配,實際上我希望它是0,因爲並不是每個詞至少出現一次。 我可以做第一個正則表達式來檢查是否至少有一個「匹配」。如果有的話,我會隨後使用第二個正則表達式來計算匹配的實際數量,但這會使我的程序比現有的運行速度慢得多。對2500個json文章執行這個正則表達式需要60到120秒的時間。

關於如何使這個更快或更好的任何想法?改變正則表達式?使用搜索或indexOf而不是匹配?


注: 我使用lawnchair DB本地持久性和jQuery。我將手機代碼和Chrome打包應用程序打包在一起。

+0

您正在搜索包含「one」和「two」以及「three」的字符串,只有兩個(不是六個)字符串包含一個,兩個和三個......爲什麼這應該是錯誤? – Gabber

+1

你可以做兩個步驟。首先使用'^(?=。* one)(?=。* two)(?=。* three)'來查看字符串是否匹配,然後使用替代形式來獲得計數。以爲我不得不說,使用通配符'(。*)'會導致糟糕的正則表現,所以如果你有很長的字符串,你會想要避免這種情況。 '.indexOf'可能是一個更好的選擇。 *編輯:*我只是注意到,你實際上已經知道你自己:) –

+1

@FelixKling是正確的(因此這是作爲一個評論,而不是一個答案張貼),以完成你正在尋找的正則表達式,但你可以做一些事情(^ =。* two)(?=。* three)(\ W *(one | two | three))+' – Gabber

回答

0
var input = '...'; 
var match = []; 
if (input.match(/^(?=.*\bone\b)(?=.*\btwo\b)(?=.*\bthree\b)/i)) { 
    match = input.match(/\b(one|two|three)\b/ig); 
} 

測試此代碼here

+0

這似乎應該可以工作 –

+0

它會是更快地使用.indexOf!= -1而不是第一個.match? –