我正在构建一个 .NET 文本格式化组件,它使用可配置的正则表达式列表来转换输入文本。我还需要允许使用正则表达式规则进行大小写转换,但我似乎无法弄清楚如何在 .NET 中执行此操作。诸如 s/(\b)([a-z])/\1\u\2/g 之类的 perl 样式替换表达式可以解决问题,但 .NET 似乎不支持它。我知道我可以将 MatchEvaluator 与委托(delegate)一起使用,但我需要我的替换规则是可配置的(文本)。
如有任何帮助,我们将不胜感激。
最佳答案
最.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 上)
关于c# - 如何在 .NET 中使用 perl 风格的替换表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5587397/