Граничная проблема Word в динамическом шаблоне C# regex

Я пытаюсь создать 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, "*");

это хорошо работает.

8
задан Wiktor Stribiżew 28 November 2019 в 08:18
поделиться

1 ответ

Try

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

or alternatively:

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

The basic reason is that the pattern you give as an example and the string you are building are quite different. Things like literal strings, such as @"foo" only matter to the C# compiler, after compilation all strings are equal. The two strings @"\b" and "\\b" are completely equal, the only difference is in how the C# compiler evaluates escape characters inside it. Which means that there is absolutely no need to incorporate C# syntax into strings you use at runtime.

Basically the string you created contained:

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

whereas you wanted the pattern

\b(test|test2)\b

So parts like the @ sign and the quotation marks were literals for the regex. Thus it wouldn't match.

23
ответ дан 5 December 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: