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