2009-09-24 5 views
5

データベースから取得したパターンの一部で正規表現パターンを作成しようとしています。例えばC#での動的正規表現パターンの構築

string pt= "@\"\\b(" + db.GetPattern + ")\\b\"";   
Regex regex = new Regex(pt, RegexOptions.IgnoreCase | RegexOptions.Compiled); 
return regex.Replace(input, "*"); 

私はそれを脱出しようとしたが、私はそれを動作させることができませんでした。手動でパターンを作成する場合は、

Regex regex = new Regex(@"\b(test|test2)\b", RegexOptions.IgnoreCase | RegexOptions.Compiled); 
return regex.Replace(input, "*"); 

となります。

答えて

18

は、代わりに

string pt = @"\b(" + db.GetPattern + @")\b"; 

かを試してみてください:

string pt = string.Concat(@"\b(", db.GetPattern, @")\b"); 

基本的な理由は、あなたが一例として与えるパターンと、あなたが構築している文字列はかなり異なっていることです。 @"foo"のようなリテラル文字列のようなものは、コンパイル後にC#コンパイラに関係なく、すべての文字列が等しい。 2つの文字列@"\b""\\b"は完全に等しいですが、唯一の違いは、C#コンパイラがその内部のエスケープ文字をどのように評価するかです。つまり、実行時に使用する文字列にC#構文を組み込む必要はありません。

は基本的にあなたが作成した文字列が含まれる:

@"\b(test|test2)\b" 

をそんなにパターン

\b(test|test2)\b 

を望んでいたのに対し、@記号と引用符のような部品は、正規表現のためのリテラルました。したがって、それは一致しません。