2009-09-24 14 views
5

Próbuję zbudować wzór regex z niektórymi częściami wzorca pobranymi z bazy danych.Budowanie dynamicznych wzorców Regex w C#

Na przykład

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

Chociaż starałem się uciec, nie mogę zmusić go do pracy. Jeśli ręcznie skompiluję wzór, działa poprawnie.

Odpowiedz

18

Spróbuj

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

lub alternatywnie:

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

Podstawowym powodem jest to, że wzór podać jako przykład i łańcuch budujesz są zupełnie inne. Rzeczy takie jak łańcuchy literalne, takie jak @"foo" mają znaczenie tylko dla kompilatora C#, po kompilacji wszystkie ciągi są równe. Dwa ciągi znaków: @"\b" i "\\b" są całkowicie równe, jedyną różnicą jest to, w jaki sposób kompilator C# ocenia znaki escape wewnątrz. Co oznacza, że ​​absolutnie nie ma potrzeby włączania składni C# do łańcuchów używanych w środowisku wykonawczym.

Zasadniczo utworzony ciąg zawarty:

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

natomiast chciałeś wzór

\b(test|test2)\b 

Więc jak części znaku @ i cudzysłowów były literały dla regex. W ten sposób nie pasowałoby.

Powiązane problemy