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

标签 c# .net regex

我正在构建一个 .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/

相关文章:

java - 正则表达式帮助 : Balance 123, 33 页。 => 123.33(双)

c# - 在 HtmlAgilityPack loadhtml 中丢失 'less than' 标志

c# - .net 中有据可查的开源项目

php - 使用php中的preg_match函数获取所选单词形式字符串之前的数字

.net - SortedList.IndexOfKey(key) 返回 item.key >= key 的项目的索引

c# - 无法解析 System.Drawing.Printing

php - 两个标点符号之间的单词的正则表达式

c# - boolean 值不能改变

c# - 如何获取 HttpRuntime.Cache 对象的到期日期时间?

c# - 在 Xamarin Forms 中从 ViewModel 绑定(bind) MasterDetailPage