如何在.NET中使用perl风格的替换表达式

时间:2011-04-07 20:43:22

标签: c# .net regex

我正在构建一个.NET文本格式化组件,它使用可配置的正则表列表来转换输入文本。我还需要允许使用正则表达式规则进行大小写转换,但我似乎无法弄清楚如何在.NET中执行此操作。一个perl风格的替换表达式,如s /(\ b)([a-z])/ \ 1 \ u \ 2 / g可以解决问题,但.NET似乎并不支持它。我知道我可以将MatchEvaluator与委托一起使用,但我需要我的替换规则可配置(文本)。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:3)

最具.NET风格的方式是

 var regex = new Regex(@"^(?<first>.*?):(?<second>.*)$", RegexOptions.Compiled);
 Console.WriteLine(regex.Replace("moon:glow", "${second}:${first}"));

将打印

 glow:moon

你也可以使用序数引用,如下所示:

 Console.WriteLine(regex.Replace("moon:glow", "$2:$1"));

将它们混合即可。

与Perl相比,您可以单独检索重复原子的所有匹配值,例如:

var regex = new Regex(@"^((?<token>.*?):)*", RegexOptions.Compiled);
foreach (Capture token in regex
         .Match("moon:glow:is:the most:beautiful:thing")
         .Groups["token"].Captures)
     Console.WriteLine(token.Value);

输出

moon
glow
is
the most
beautiful

要获得复杂的匹配评估,您可以这样做。

var upper = Regex.Replace("moon:glow:is:the most:beautiful:thing", "(.*?)(:|$)",                  
    m => m.Groups[1].Value.ToUpper() + m.Groups[2]);
Console.WriteLine(upper);

不幸的是,我认为没有简单的方法可以将这样的评估功能配置为仅文本(除非使用编译器作为服务,我知道在Mono上可用,但我对MS .Net还不太确定) )