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

时间:2013-07-19 13:55:29

标签: c# regex replace

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

  

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

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

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

1 个答案:

答案 0 :(得分: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);
}

模式\[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);
}

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