Regex.Replace (string, MatchEvaluator) не работает должным образом - PullRequest
1 голос
/ 15 сентября 2009

У меня есть следующая строка:

[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]

Мне нужно изменить его, чтобы он выглядел следующим образом:

[global::System.CodeDom.Compiler.GeneratedCodeAttribute("myClass", "myVersion")]

Самым простым способом достижения этого, очевидно, является использование Regex для захвата фрагментов, которые я хочу из этой строки, а затем объединение результатов с моим дополнительным текстом. Однако я пытаюсь использовать метод Regex.Replace(), чтобы сделать код немного чище:

Regex generatedCodeAttributeRegex = new Regex("\\[[?:global::|]System.CodeDom.Compiler.GeneratedCodeAttribute\\((\"System.Data.Design.TypedDataSetGenerator\",[\\s+]\"2.0.0.0\")\\)\\]");

inputFileContent = generatedCodeAttributeRegex.Replace(inputFileContent, delegate(Match m)
{
  return string.Format("\"{0}\", \"{1}\"",
                       this.GetType(),
                       Assembly.GetExecutingAssembly().GetName().Version);
});

Насколько я понимаю, это должно заменить захваченную группу текстом, указанным в делегате ... проблема в том, что это не так. Что я делаю неправильно? И возможно ли этого добиться с помощью перегрузки Regex.Replace(string, string)?

Ответы [ 3 ]

2 голосов
/ 15 сентября 2009

Я бы сделал это, оглядываясь назад @"(?<=)" и заглядывая в будущее @"(?=)" примерно так:

"(?<=\[global::System\.CodeDom\.Compiler\.GeneratedCodeAttribute\()([^\)]*)(?=\)\])"

Тогда ваша замещающая строка должна работать как есть.

0 голосов
/ 15 сентября 2009

Не уверен насчет специализаций C #, но я предполагаю, что регулярное выражение совершенно неверно. Квадратные скобки используются неправильно. Они могут только определять классы символов и не могут использоваться для захвата подшаблонов. Все это при условии, что C # использует регулярные регулярные выражения в стиле perl.

Правильное регулярное выражение для этого будет (внимание, не экранированный):

\[(global::)?System\.CodeDom\.Compiler\.GeneratedCodeAttribute\("([^"]+)", "([^"]+)"\)\]

Мой совет: сначала зайдите на http://regexpal.com/, чтобы проверить свои регулярные выражения, а затем внедрите их в свой код. Экономит много хлопот.

0 голосов
/ 15 сентября 2009

Ваше регулярное выражение не соответствует, потому что вы написали [?:global::|], то есть диапазон символов, содержащий символы?,:, G, l, o, b, a,: и |. Вы, вероятно, имели в виду (?:global::|), что совпадает с (?:global::)?, то есть "global :: or nothing".

Также обратите внимание, что, не выходя из точек, они будут соответствовать чему угодно - не только буквальным точкам. Хотя это вряд ли вызовет проблемы.

Если вы исправите это, оно будет работать, но не совсем так, как вы хотите, поскольку Regex.Replace заменяет все совпадение, а не только часть в группе захвата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...