2009-09-24 57 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#编译器很重要,编译后所有的字符串都是相等的。两个字符串@"\b""\\b"完全相同,唯一区别在于C#编译器如何评估其中的转义字符。这意味着绝对不需要将C#语法并入您在运行时使用的字符串中。

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

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

,而你想要的图案

\b(test|test2)\b 

所以像@符号和引号部分是为正则表达式文字。因此它不匹配。