假设我有一些这样的文字:
[MyAppTerms.TermName1]。 [MyAppTerms.TermName2]。 1- [MyAppTerms.TermNameX] 2- ...
我希望将[MyAppTerms.Whatever]
的每次出现替换为ReadTerm( "MyAppTerms.Whatever" )
的结果,其中ReadTerm
是一个静态函数,它接收一个术语名称并返回当前语言的术语文本。
使用Regex.Replace
这是否可行? (欢迎替代方案)。我正在研究替换组,但我不确定我是否可以使用它们。
答案 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
委托。