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