假设我有一些这样的文本:
[MyAppTerms.TermName1]. [MyAppTerms.TermName2]. 1- [MyAppTerms.TermNameX] 2- ...
我想用 ReadTerm( "MyAppTerms.Whatever")
的结果替换每次出现的 [MyAppTerms.Whatever]
,其中 ReadTerm
是一个静态函数,它接收术语名称并返回当前语言的术语文本。
使用 Regex.Replace
是否可行? (欢迎选择)。我正在研究替换组,但我不确定是否可以对它们使用函数。
最佳答案
使用 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
委托(delegate)中检索该组并传递给您实际的 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
委托(delegate)。
关于c# - 正则表达式替换 : Transform pattern with a custom function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17747919/