2011-06-29 48 views
1

我正在處理搜索頁面上的用戶輸入。如果用戶選擇「全部單詞」類型搜索,則從搜索文本中刪除任何布爾搜索運算符,並在每個真實單詞之間插入' AND '。在大多數情況下非常簡單。但是,我無法弄清楚如何刪除連續的兩個布爾運算符。正則表達式的過程布爾短語

這裏是我的代碼:

// create the regex 
private static Regex _cleaner = 
    new Regex("(\\s+(and|or|not|near)\\s+)|\"", 
      RegexOptions.Compiled | RegexOptions.IgnoreCase); 

// call the regex 
_cleaner.Replace(searchText, " ") 

當用戶進入像coffee and not tea搜索字符串出現問題。正則表達式將刪除'和',但不是'不'。由此產生的字符串是'咖啡茶' - 我想要的是'咖啡茶'。

在正則表達式中需要空格,所以當嵌入真實詞語(比如'band'或'corps')時,我不會刪除'和','或'等。

我已經通過調用clean方法兩次臨時解決了這個問題,這將刪除連續的兩個操作符(這可能是我所需要的)。但它不是很優雅,是嗎?我真的很想做正確的事。我覺得我失去了一些東西簡單...

+0

SQL注入安全嗎? –

+2

你的正則表達式不會「不喝咖啡和茶」,這與「茶而不是咖啡」是一回事。 –

+0

@Yurij - 是的 - 那是在其他地方處理的 – Ray

回答

3

嘗試增加單詞邊界:

"\\b(and|or|not|near)\\b|\"" 
+0

就是這樣 - 我知道這是「明顯」的東西 - thanx對你的幫助 – Ray

1

您正則表達式更改爲以下:

private static Regex _cleaner = new Regex("(\\s+(and|or|not|near)\\s+)*|\"", RegexOptions.Compiled | RegexOptions.IgnoreCase); 
0

將不僅僅增加了+解決這一問題?

private static Regex _cleaner = 
    new Regex("(\\s+(and|or|not|near)\\s+)+|\"", 
       RegexOptions.Compiled | RegexOptions.IgnoreCase); 

// call the regex 
_cleaner.Replace(searchText, " ") 
0

你的正則表達式不匹配,因爲你需要在你的任期的每一側的空白,但因爲它不是_and__not_,你只匹配_and_

考慮這個表達式:

@"(?:and|or|not|near)\s+|"""