c# - 如何正则表达式用方法结果替换匹配组项

标签 c# regex

输入的字符串是这样的:

A 行:50

B 线:120

A 行:12

B 行:53

我想用 MultiplyCalculatorMethod(LineAValue) 的结果替换 LineB 值,其中 LineAValueLineB 上方行的值> 和 MultiplyCalculatorMethod 是我的另一个复杂的 C# 方法。

在半代码中,我想做这样的事情:

int MultiplyCalculatorMethod(int value)
{
   return 2 * Math.Max(3,value);
}
string ReplaceValues(string Input)
{
   Matches mat = Regex.Match(LineA:input_value\r\nLineB:output_value)
   foreach (Match m in mat)
   {
       m.output_value = MultiplyCalculatorMethod(m.input_value)
   }
   return m.OutputText;
}

Example:

string Text = "LineA:5\r\nLineB:2\r\nLineA:2\r\nLineB:7";
string Result = ReplaceValues(Text);
//Result = "LineA:5\r\nLineB:10\r\nLineA:2\r\nLineB:6";

我写了一个 Regex.Match 来匹配 LineA: value\r\nLineB: value 并在组中获取这些值。但是当我使用 Regex.Replace 时,我只能提供一个“静态”结果,该结果组合了匹配项中的组,但我不能在那里使用 C# 方法。

所以我的问题是如何 Regex.Replace,其中 Result 是 C# 方法的结果,其中输入是 LineA 值。

最佳答案

您可以像这样使用 MatchEvaluator:

public static class Program
{
    public static void Main()
    {
        string input = "LineA:5\r\nLineB:2\r\nLineA:2\r\nLineB:7";
        string output = Regex.Replace(input, @"LineA:(?<input_value>\d+)\r\nLineB:\d+", new MatchEvaluator(MatchEvaluator));
        Console.WriteLine(output);
    }

    private static string MatchEvaluator(Match m)
    {
        int inputValue = Convert.ToInt32(m.Groups["input_value"].Value);
        int outputValue = MultiplyCalculatorMethod(inputValue);

        return string.Format("LineA:{0}\r\nLineB:{1}", inputValue, outputValue);
    }

    static int MultiplyCalculatorMethod(int value) 
    { 
        return 2 * Math.Max(3, value); 
    }
}

关于c# - 如何正则表达式用方法结果替换匹配组项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/767869/

相关文章:

regex - 从文本文件中提取信息 block 并创建 Pandas 数据框并存储

mysql - 查找 SQL 查询中的单词是否在子查询中

regex - 正则表达式模式

regex - 如果使用 linux 命令行工具在文本文件的下一行中满足条件,则替换换行符

java - 不匹配不同语言的模式对象

c# - 在 Swagger 中更改响应类属性的命名

c# - 可测试性与过度设计?

c# - 使用 FileHelpers 填充零

c# - HostingEnvironment 不包含 IsHosted 的定义

c# - 是否有等效于 Java 的 ToStringBuilder for C#?一个好的 C# 版本有什么特点?