2012-10-31 159 views
2

我正在使用正則表達式來執行網站搜索。 如果我搜索:「米爾伍德別墅」(這是一個社區名稱)和相應的社區名稱是「米爾伍德別墅」,我會得到結果。正則表達式匹配短語中的單個單詞

如果我搜索「Millwood別墅」,則沒有結果填充。

我的意思是,這個短語是作爲一個整體,並匹配。有什麼方法可以匹配輸入短語中單個單詞的任何發生?所以「毫木別墅」仍然會帶來 「米爾伍德別墅」的結果?

這是我要匹配的團體名稱:

Regex.IsMatch(MarketingCommunityName.Trim(), pattern, RegexOptions.IgnoreCase) 

其中pattern是輸入的搜索短語和MarketingCommunityName是實際的社區名稱。

在此先感謝!

+2

您是否嘗試過運行基於模式的'Split'多次調用'IsMatch'? –

+0

您也可以搜索Villas或Millwood,並檢查附近的單詞是否包含Villas或Millwood(取決於您搜索的內容) – 2pietjuh2

+0

我嘗試過,但只有當模式和社區名稱完全匹配時,Ismatch纔會返回true。將社區名稱和模式分割爲單個單詞不會很好,因爲每個社區都會有'the'或'a'或'at'這樣的詞,因此匹配它並不合適。此外,我們有1000個社區,每個社區名稱上至少有5個字。 – user1165815

回答

1

儘管我認爲你應該在一個空格處搜索你的搜索模式,然後再單獨檢查每個單詞,但構建一個不依賴於順序的單元並不難從您的搜索模式正則表達式:

var searchWords = searchString.Trim().Split(new Char[] {' '}); 

string pattern = @"^(?=.*" + String.Join(@")(?=.*", searchWords) + ")"; 

這構造了一個正則表達式,其中包含每個搜索詞的一個lookahead斷言。每個lookahead斷言都從字符串的開始處開始,並查看搜索詞是否出現在字符串內的任何位置。請注意,如果您的searchString包含正則表達式元字符,您可能會遇到問題,所以應該事先轉義這些字符。

0

甲正則表達式模式找到兩個圖案將是

\bMillwood\b.*\bvillas\b 

其中\b表示開始或字的結束和.*代表任何數量的字符。

我你不介意的話找到的一部分,你可以刪除\b

Millwood.*villas 

然而,你不會發現"villas of Millwood"例如。這種模式將

Millwood.*villas|villas.*Millwood 

但是,如果你想擴大這個檢索算法對由三個以上的單詞正則表達式是不是實現這種模糊邏輯的正確的選擇模式。我會計算不同的加工單詞的數量,並返回產生最小計數的短語。 (可能至少有60%的給定單詞)

0

斯普利特短語,檢查每一個字

pattern.Split(' ') 
    .All(word=>Regex.IsMatch(MarketingCommunityName.Trim(), word, RegexOptions.IgnoreCase) 
相關問題