C # регулярное выражение заменить неожиданное поведение - PullRequest
2 голосов
/ 22 января 2009

Учитывая $displayHeight = "800";, заменить любое число в 800 на значение int y_res.

resultString = Regex.Replace(
    im_cfg_contents, 
    @"\$displayHeight[\s]*=[\s]*""(.*)"";", 
    Convert.ToString(y_res));

В Python я бы использовал re.sub, и это сработало бы. В .NET он заменяет всю строку, а не соответствующую группу.

Что такое быстрое решение?

Ответы [ 5 ]

2 голосов
/ 22 января 2009

Опираясь на пару уже опубликованных ответов. Утверждение нулевой ширины позволяет выполнять сопоставление с регулярным выражением, не помещая эти символы в соответствие. Поместив первую часть строки в группу, мы отделили ее от цифр, которые вы хотите заменить. Затем, используя утверждение обратной ширины нулевой ширины в этой группе, мы позволяем регулярному выражению действовать как обычно, но пропускаем символы в этой группе в совпадении. Точно так же мы поместили последнюю часть строки в группу и использовали предварительное утверждение нулевой ширины. Группировка Constructs на MSDN показывает группы, а также утверждения.

resultString = Regex.Replace(
    im_cfg_contents, 
    @"(?<=\$displayHeight[\s]*=[\s]*"")(.*)(?="";)", 
    Convert.ToString(y_res));

Другой подход заключается в использовании следующего кода. Модификация регулярного выражения просто помещает первую часть в группу и последнюю часть в группу. Затем в строку замены мы добавляем обратно в первую и третью группы. Не так хорошо, как первый подход, но не так плохо, как выписывание части $ displayHeight. Подстановки в MSDN показывает, как работают символы $.

resultString = Regex.Replace(
    im_cfg_contents, 
    @"(\$displayHeight[\s]*=[\s]*"")(.*)("";)", 
    "${1}" + Convert.ToString(y_res) + "${3}");
0 голосов
/ 22 января 2009

Проверьте этот шаблон

(?<=(\$displayHeight\s*=\s*"))\d+(?=";)

Слово о " lookaround ".

0 голосов
/ 22 января 2009

Вы также можете попробовать это, хотя я думаю, что это немного медленнее, чем мой другой метод:

resultString = Regex.Replace(
    im_cfg_contents,
    "(?<=\\$displayHeight[\\s]*=[\\s]*\").*(?=\";)",
    Convert.ToString(y_res));
0 голосов
/ 22 января 2009

Он заменяет всю строку, потому что вы сопоставили всю строку - ничто в этом операторе не говорит C # о замене только совпадающей группы, он обязательно найдет и сохранит эту сопоставленную группу, но все равно будет соответствовать всей строке в целом. 1001 *

Вы можете изменить свой заменитель на:

@"\$displayHeight = """ + Convert.ToString(y_res) + @""";"

.. или вы можете изменить свой шаблон так, чтобы он просто совпадал с цифрами, т.е.

@"[0-9]+"

.. или вы можете увидеть, поддерживает ли регулярное выражение в C # обходные пути (я не уверен, что это не так), и соответственно изменить свое соответствие.

0 голосов
/ 22 января 2009

Попробуйте это:

resultString = Regex.Replace(
    im_cfg_contents,
    @"\$displayHeight[\s]*=[\s]*""(.*)"";",
    @"\$displayHeight = """ + Convert.ToString(y_res) + @""";");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...