正则表达式替换:使用自定义函数转换模式

dar*_*mos 4 c# regex replace

假设我有一些这样的文字:

[MyAppTerms.TermName1].[MyAppTerms.TermName2].1- [MyAppTerms.TermNameX] 2- ...

我想[MyAppTerms.Whatever]用结果替换每一个出现的结果ReadTerm( "MyAppTerms.Whatever" ),其中ReadTerm一个静态函数接收一个术语名称并返回当前语言的术语文本.

这是可行的Regex.Replace吗?(欢迎替代方案).我正在研究替换组,但我不确定我是否可以使用它们.

Mat*_*ens 11

使用Regex.Replace(String, MatchEvaluator)过载.

static void Main()
{
    string input = "[MyAppTerms.TermName1]. [MyAppTerms.TermName2]. 1- [MyAppTerms.TermNameX] 2";
    Regex regex = new Regex(@"\[MyAppTerms\.([^\]]+)\]");
    string output = regex.Replace(input, new MatchEvaluator(RegexReadTerm));

    Console.WriteLine(output);
}

static string RegexReadTerm(Match m)
{
    // The term name is captured in the first group
    return ReadTerm(m.Groups[1].Value);
}
Run Code Online (Sandbox Code Playgroud)

该模式\[MyAppTerms\.([^\]]+)\]与您的[MyAppTerms.XXX]标记匹配并捕获XXX捕获组中的标记.然后在您的MatchEvaluator委托中检索该组并将其传递给您的实际ReadTerm方法.

使用lambda表达式更好(因为C#3.0):

static void Main()
{
    string input = "[MyAppTerms.TermName1]. [MyAppTerms.TermName2]. 1- [MyAppTerms.TermNameX] 2";
    Regex regex = new Regex(@"\[MyAppTerms\.([^\]]+)\]");
    string output = regex.Replace(input, m => ReadTerm(m.Groups[1].Value));

    Console.WriteLine(output);
}
Run Code Online (Sandbox Code Playgroud)

在这里,您可以在使用它的代码中直接定义求值程序(将逻辑上连接的代码段保持在一起),同时编译器负责构造该MatchEvaluator委托.

  • 这是一个完美的情况,其中lambda表达式给出了更简洁的代码,恕我直言.`regex.Replace(input,match => ReadTerm(match));` (2认同)