c# - 正则表达式替换 : Transform pattern with a custom function

标签 c# regex replace

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

[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/

相关文章:

c# - String.Replace 不适用于 php 文件?

regex - 解析文本以获取Elasticsearch索引并获取索引值

ruby - 正则表达式包含单连字符但排除双连字符

xml - 通过 Powershell 替换 xml 文件中的文本

java - 从 Java 字符串中去除前导和尾随空格

c# - XNA - GraphicsDevice 初始化困惑

C# 使用条件运算符插入字符串

c# - 无法在类库包中的 Entity Framework 7 beta4 上运行迁移

regex - 发送到特定域的电子邮件的 HTML 模式

python - 按键用先前或后续值填充缺失值