Intereting Posts
Вычисление против таблиц поиска для производительности синусоидности? Получить точки, заключенные 3d-полигоном запретить запуск приложения ac # из нескольких экземпляров Как создать ViewModel на основе объекта DataContext DataTemplate? Добавление нескольких ячеек в одну строку Ошибка ASP.NET Core 2.0 JWT завершается с ошибкой `Authorization для пользователя: (null)` error Поведение статических членов с несколькими экземплярами приложения – C # Лучший способ представления множеств из 3 значений Model.List имеет значение null для POST с использованием Razor Установка минимального / максимального увеличения для карт Bing в Silverlight Флагирование правил правильности привязки не останавливается при первом отказе print double с цифрами после десятичной точки Как запустить программу Unity в фоновом режиме? Получить последний результат инструкции во встроенном IronPython v2 Преобразователь с несколькими параметрами

Как Regex заменить элемент группы соответствия на результат метода

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

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.

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

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

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

Вы можете использовать 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:(?\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); } }