C # регулярное выражение заменить неожиданное поведение

2

Учитывая $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
Лучший ответ

Основываясь на нескольких ответах, уже опубликованных. Утверждение с нулевой шириной позволяет выполнить регулярное выражение, не помещая эти символы в соответствие. Поместив первую часть строки в группу, мы отделили ее от цифр, которые вы хотите заменить. Затем, используя утверждение нулевой ширины 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}");
0

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

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

Слово о " lookaround".

0

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

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

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

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

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

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

@"[0-9]+"

.. или вы можете увидеть, поддерживает ли регулярное выражение С# обратные пути (я не уверен, что он делает небрежно) и соответственно меняйте свое соответствие.

  • 0
    нет ведущей / входной строки заменителя
  • 0
    ты потерял меня ...
Показать ещё 2 комментария
0

Попробуйте следующее:

resultString = Regex.Replace(
    im_cfg_contents,
    @"\$displayHeight[\s]*=[\s]*""(.*)"";",
    @"\$displayHeight = """ + Convert.ToString(y_res) + @""";");
  • 0
    Я согласен, это будет работать, но, черт возьми, это безобразно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню