4

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

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

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

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

4

1 回答 1

12

使用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委托。

于 2013-07-19T14:11:12.883 回答