2009-04-20 13 views
7

Ciąg wejściowy jest coś takiego:Jak regex zastąpić element grupy mecz z wynikiem metody

Linea: 50

LineB: 120

Linea: 12

LineB: 53

Chciałbym zastąpić wartości linii B wynikiem MultiplyCalculatorMethod(LineAValue), gdzie LineAValue jest wartością linii powyżej LineB i MultiplyCalculatorMethod to moja inna, skomplikowana metoda C#.

w Semi-kodu, chciałbym zrobić coś takiego:

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"; 

Napisałem Regex.Match dopasować LineA: value\r\nLineB: value i uzyskać te wartości w grupach. Ale kiedy używam Regex.Replace, mogę podać tylko "statyczny" wynik, który łączy grupy z meczu, ale nie mogę tam użyć metod C#.

Moje pytanie brzmi: jak Regex.Replace where Result jest wynikiem metody C#, gdzie input jest wartością LineA.

+0

@tomaszs: to nie jest do końca jasne dla mnie. Być może pomocne byłoby podanie ciągów wyników, których można się spodziewać po danych ciągach wejściowych. –

+0

Dodałem przykład –

Odpowiedz

4

Spróbuj użyć polecenia Zastąp przeciążenie.

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

MatchEvaluator ma dostęp do zawartości dopasowania i może wywoływać dowolne inne metody zwracania zastępczego ciągu znaków.

7

Można użyć MatchEvaluator tak:

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); 
    } 
}