正则表达式在{}之间选择值,并使用此选定值将其替换为新字符串

时间:2012-01-20 15:46:36

标签: c# regex string replace

我正在尝试替换大量数据中的字符串,我希望使用正则表达式来处理我必须对文本进行的某些更新,我应该指出我对正则表达式相当新。

显示这是我想要实现的目标。在我正在转换的文本中,我们有以下数据{0} {1} {2},这必须转换为新格式,以便 {0}变为%{param0},{1}变为%{param1},{2}变为%{param2}。

这个数字没有限制,到目前为止它已达到16并且未来可能上升(应该指出这个数字实际上是一个字符串)。这是我到目前为止的代码,但它只将值更新为{param0}。此外,如果文本包含多个实例,则仅更新第一个实例。

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

谢谢, Brendy

3 个答案:

答案 0 :(得分:1)

你可以写:

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

关于这个:

  

此外,如果文本包含多个实例,则仅更新第一个实例。

如果您的字符串为{0} {1} {2},那么您的代码会将0} {1} {2部分替换为param0} {1} {2,最终结果为{param0} {1} {2}。所以看起来就像只更新第一个实例一样,但它真正做的是更新所有实例,就像它们是单个实例一样。这是因为.*符号尽可能地吞噬,同时仍允许正则表达式匹配。

答案 1 :(得分:0)

除非您确实需要使用正则表达式来查找模式,否则您可能需要考虑String.ReplaceStringBuilder.Replace。有关详情,请参阅以下内容:Regex.Replace, String.Replace or StringBuilder.Replace which is the fastest?Memory Efficiency and Performance of String.Replace .NET Framework

答案 2 :(得分:0)

MSDN documentation for Regex.Replace

  

replacement参数指定要替换输入中每个匹配项的字符串。替换可以包含文字文本和替换的任意组合。例如,替换模式a * $ {test} b插入​​字符串&#34; a *&#34;后跟由测试捕获组匹配的子字符串(如果有),后跟字符串&#34; b&#34;。 *字符在替换模式中不被识别为元字符。

这意味着您只需使用捕获组来保持数字。尝试

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