Как Regex заменить элемент группы совпадений на результат метода - PullRequest
7 голосов
/ 20 апреля 2009

Строка ввода выглядит примерно так:

LineA: 50

LineB: 120

LineA: 12

LineB: 53

Я хотел бы заменить значения LineB на результат MultiplyCalculatorMethod(LineAValue), где LineAValue - это значение строки выше LineB, а 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 #, где input это значение LineA.

Ответы [ 2 ]

7 голосов
/ 20 апреля 2009

Вы можете использовать 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); 
    }
}
4 голосов
/ 20 апреля 2009

Попробуйте использовать следующую замену перегрузки.

public static string Replace( string input, string pattern, MatchEvaluator evaluator);

MatchEvaluator имеет доступ к содержимому Match и может вызывать любые другие методы для возврата строки замены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...