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

本文关键字:风格 perl 替换 表达式 net | 更新日期: 2023-09-27 17:49:30

我正在构建一个。net文本格式化组件,它使用一组可配置的正则表达式来转换输入文本。我还需要允许使用regex规则进行大小写转换,但我似乎不知道如何在。net中做到这一点。perl风格的替换表达式,如s/('b)([A -z])/'1'u'2/g,可以做到这一点,但。net似乎不支持它。我知道我可以使用MatchEvaluator与委托,但我需要我的替换规则是可配置的(文本)。

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

最。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尚未)