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

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

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

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

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

Спасибо брэнди

3 ответа

Решение

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

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

В соответствии с этим:

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

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

В документации MSDN для Regex.Replace написано

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

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

newText = Regex.Replace(newText, @"\{(?<Num>\d+)\}", "%{param${num}}");

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

Другие вопросы по тегам