Regex, чтобы выбрать значение между {} и заменить его новой строкой, используя это выбранное значение - PullRequest
0 голосов
/ 20 января 2012

Я пытаюсь заменить строки в большом количестве данных, и я надеялся использовать регулярное выражение для определенных обновлений, которые я должен внести в текст, я должен отметить, что я довольно плохо знаком с регулярными выражениями.

Покажите здесь, чего я пытаюсь достичь. В тексте, который я преобразовываю, у нас есть следующие данные {0} {1} {2}, их необходимо преобразовать в новый формат, чтобы {0} становится% {param0}, {1} становится% {param1}, {2} становится% {param2}.

Нет никаких ограничений на то, каким может быть число, пока оно достигло 16 и может возрасти в будущем (следует отметить, что число на самом деле является строкой в ​​этой точке). Это код, который у меня есть, но он только обновляет значение до {param0}. Также, если текст содержит более одного экземпляра, он обновляет только первый.

   NewText = Regex.Replace(NewText , @"(?<=\{).*(?=\})", "param$0");

Спасибо, Brendy

Ответы [ 3 ]

1 голос
/ 20 января 2012

Вы можете написать:

   NewText = Regex.Replace(NewText , @"\{(0|[1-9]\d*)}", "%{ param$1 }");

Относительно этого:

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

Что действительно происходит, так это то, что если ваша строка {0} {1} {2}, то ваш код заменит часть 0} {1} {2 на param0} {1} {2, что даст конечный результат {param0} {1} {2}. Так что выглядит как будто он обновляет только первый экземпляр, но на самом деле он обновляет все экземпляры , как если бы они были одним экземпляром . Это связано с тем, что нотация .* сглатывает настолько, насколько это возможно, и в то же время позволяет регулярному выражению совпадать.

0 голосов
/ 20 января 2012

Документация MSDN для Regex. Замена говорит

Параметр замены указывает строку, которая должна заменять каждое совпадение на входе. замена может состоять из любой комбинации буквального текста и замен. Например, шаблон замены a * $ {test} b вставляет строку «a *», за которой следует подстрока, которой соответствует группа захвата теста, если таковая имеется, и строка «b». Символ * не распознается как метасимвол в шаблоне замены.

Это означает, что вы можете просто использовать группу захвата, чтобы сохранить номер вокруг. Попробуйте

newText = Regex.Replace(newText, @"\{(?<Num>\d+)\}", "%{param${num}}");
0 голосов
/ 20 января 2012

Если вам действительно не нужно использовать регулярные выражения для поиска своего паттерна, вы можете рассмотреть String.Replace или StringBuilder.Replace. Обратитесь к ним для получения дополнительной информации: Regex.Replace, String.Replace или StringBuilder.Replace, который является самым быстрым? или Эффективность памяти и производительность String.Replace .NET Framework

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