2012-03-13 64 views
0

我有一個接受2個參數的函數。 參數1:SEARCHTERM, 參數2:產品名稱用c#正則表達式檢查句子中是否有詞匹配

如何檢查是否存在產品名稱在搜索關鍵詞的話,不要緊,它發生在開始,中間或結尾產品名稱的?

它必須逐字匹配,比如說SearchTerm =「cano」,ProductName =「canon」,它應該返回false,不匹配。

回答

4

如果您只想匹配需要的完整單詞word boundaries\b,請在搜索詞前後添加。

\b是一個零寬度斷言,匹配從單詞到非單詞字符或從非單詞到單詞字符的變化。

String term = "Foo"; 
String[] text = { "This contains Foo bar.", "Foo.", "Foobar", "BarFoo", "foo" }; 

Regex reg = new Regex(@"\b" + Regex.Escape(term) + @"\b"); 

foreach (var item in text) { 
    Match word = reg.Match(item); 
    if (word.Success) { 
     Console.WriteLine(item + ": valid"); 
    } 
    else { 
     Console.WriteLine(item + ": invalid"); 
    } 
} 

輸出:

這包含富吧。 =>有效
Foo。 =>有效
Foobar的=>無效
BarFoo =>無效
富=>無效

-1

你不需要正則表達式來進行簡單的字符串搜索。

ProductName.Contains(searchTerm); 

http://msdn.microsoft.com/en-us/library/dy85x1sa.aspx

+2

不過,他希望避免像「可以」而在一個句子時發現「內經」中的那句話。 「.Contains」不會避免這種情況。 – 2012-03-13 06:19:21

+0

我回答後更新了問題。 :) – hungryMind 2012-03-13 08:11:12

1

因爲你希望能夠指定,它是一個單獨的單詞,而不是一分的話,你需要使用regexes

你的正則表達式可能會是這樣的,如果你正在尋找存儲在變量「笑」字:

Regex regex1 = new Regex(lol + @"[^a-Z]"); // include grammar marks to avoid issues like "can." not matching 

本質上講,你想嘗試匹配只是一句話,使確定在它後面有一個不是另一個字母的字符。那樣,你知道這不是另一個詞。

編輯:試試這個美容代替。自己學了點東西。

string sPattern = @"\b" + lol + @"\b"; 

Here's some example usage.

EDIT2:看起來STEMA了它第一。 Here's the page I used, for reference.

+2

您的解決方案有幾個問題。首先它會拋出一個Exception「Range in reverse order」,因爲「Z」出現在「a」之前,另一種方式也是錯誤的,因爲在「Z」和「a」之間有6個非字母字符在ASCII表中。接下來的問題是,如果搜索詞後面有字符串結尾,那麼它將失敗,最後:如果文本中的詞之前存在某些內容,會發生什麼情況? – stema 2012-03-13 06:56:35

+0

所有優秀點。爲了我自己的利益,我顯然有點太晚了。讓我看看在我乾草之前是否能解決這個問題。 – 2012-03-13 06:59:03

+1

+1用於改善您的答案(現在正確) – stema 2012-03-13 07:38:04