在C#中构建动态正则表达式模式

时间:2009-09-24 12:58:46

标签: c# regex

我正在尝试构建一个正则表达式模式,其中包含从数据库中检索的某些模式部分。

例如

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, "*");

它工作正常。

1 个答案:

答案 0 :(得分:22)

尝试

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

或者:

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

基本原因是您作为示例提供的模式和您正在构建的字符串是完全不同的。文字字符串之类的东西,例如@"foo"只对C#编译器有用,编译后所有字符串都相等。两个字符串@"\b""\\b"完全相同,唯一的区别在于C#编译器如何评估其中的转义字符。这意味着绝对不需要将C#语法合并到运行时使用的字符串中。

基本上你创建的字符串包含:

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

而你想要模式

\b(test|test2)\b

因此@符号和引号等部分是正则表达式的文字。因此它不匹配。