2011-06-29 1 views
1

検索ページでユーザー入力を処理しています。ユーザーが「すべての単語」タイプの検索を選択すると、検索テキストからブール値の検索演算子が削除され、実際の単語の間にスティック' AND 'が貼り付けられます。ほとんどの場合かなり簡単です。しかし、私はどのように2つの論理演算子を一列に取り除くかを理解できません。Regexでプロセスブールフレーズ

// 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のような検索文字列を入力したときに問題が発生します。

は、ここに私のコードです。正規表現は 'と'を削除しますが、 'ない'は削除しません。結果の文字列は「coffeenot tea」です。私が欲しいのは「コーヒー茶」です。

(「バンド」または '軍団のような)実際の言葉に埋め込まれたときに、私はなど、削除「と」、「または」ないように空白が正規表現に必要とされます。

私は一時的にクリーンメソッドを2回呼び出すことでこれを解決しました。これにより、2つの演算子が連続して削除されます(これはおそらくすべて必要です)。しかしそれはあまりエレガントではありませんか?私は本当にそれを正しくしたいと思います。私は、単純な何かが欠けていますように...

+0

SQLインジェクション:

は、この正規表現を考えてみましょうか? –

+2

あなたの正規表現は "コーヒーと紅茶ではなく"、 "紅茶とコーヒーではない"と同じことに失敗します。 –

+0

@Yurij - はい - それは他のところで扱われています – Ray

答えて

3

単語の境界を追加してみてください:

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

それはそれだった - 私はそれがあなたの助けに何か「明白な」ものであることを知っていた – 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+|"""