Учитывая $displayHeight = "800";
, замените любое число на 800
на значение int y_res
.
resultString = Regex.Replace(
im_cfg_contents,
@"\$displayHeight[\s]*=[\s]*""(.*)"";",
Convert.ToString(y_res));
В Python я бы использовал re.sub, и это сработает. В .NET она заменяет всю строку, а не сопоставляемую группу.
Что такое быстрое исправление?
Основываясь на нескольких ответах, уже опубликованных. Утверждение с нулевой шириной позволяет выполнить регулярное выражение, не помещая эти символы в соответствие. Поместив первую часть строки в группу, мы отделили ее от цифр, которые вы хотите заменить. Затем, используя утверждение нулевой ширины lookbehind в этой группе, мы разрешаем регулярное выражение действовать как нормальное, но опускаем символы в этой группе в матче. Точно так же мы поместили последнюю часть строки в группу и использовали утверждение с нулевой шириной. Группировка конструкций в 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}");
Вы также можете попробовать это, хотя я думаю, что он немного медленнее, чем мой другой метод:
resultString = Regex.Replace(
im_cfg_contents,
"(?<=\\$displayHeight[\\s]*=[\\s]*\").*(?=\";)",
Convert.ToString(y_res));
Он заменяет всю строку, потому что вы сопоставили всю строку - ничего об этом утверждении не говорит о том, что С# заменяет только согласованную группу, она найдет и сохранит эту согласованную группу, но она по-прежнему соответствует всей строке в целом.
Вы можете либо заменить свой заменитель на:
@"\$displayHeight = """ + Convert.ToString(y_res) + @""";"
.. или вы можете изменить свой шаблон, чтобы просто соответствовать цифрам, т.е.:
@"[0-9]+"
.. или вы можете увидеть, поддерживает ли регулярное выражение С# обратные пути (я не уверен, что он делает небрежно) и соответственно меняйте свое соответствие.
Попробуйте следующее:
resultString = Regex.Replace(
im_cfg_contents,
@"\$displayHeight[\s]*=[\s]*""(.*)"";",
@"\$displayHeight = """ + Convert.ToString(y_res) + @""";");