2009-04-20 14 views
7

इनपुट स्ट्रिंग कुछ इस तरह है:कैसे regex के लिए विधि परिणाम के साथ मैच समूह आइटम की जगह

लीनिया: 50

LineB: 120

लीनिया: 12

LineB: 53

मैं MultiplyCalculatorMethod(LineAValue) के परिणामस्वरूप लाइनबी मानों को प्रतिस्थापित करना चाहता हूं, जहां LineAValueसे ऊपर की रेखा का मान हैऔर MultiplyCalculatorMethod मेरी अन्य, जटिल सी # विधि है।

अर्द्ध कोड में, मैं कुछ इस तरह करना चाहते हैं:

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

मैं LineA: value\r\nLineB: value से मेल खाते हैं और समूहों में इन मूल्यों को प्राप्त करने के लिए एक Regex.Match लिखा था। लेकिन जब मैं Regex.Replace का उपयोग करता हूं, तो मैं केवल "स्थिर" परिणाम प्रदान कर सकता हूं जो मैच से समूहों को जोड़ रहा है, लेकिन मैं वहां सी # विधियों का उपयोग नहीं कर सकता।

तो मेरे प्रश्न Regex को कैसे करें। जगह बदलें जहां परिणाम सी # विधि का परिणाम है जहां इनपुट LineA मान है।

+0

@tomaszs: यह पूरी तरह से मेरे लिए स्पष्ट नहीं है। शायद आपके दिए गए इनपुट स्ट्रिंग के लिए अपेक्षित परिणाम स्ट्रिंग प्रदान करने में आपकी सहायता होगी। –

+0

मैंने उदाहरण जोड़ा है –

उत्तर

4

निम्नलिखित प्रतिस्थापन अधिभार का उपयोग करने का प्रयास करें।

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

MatchEvaluator के पास मिलान सामग्री तक पहुंच है और प्रतिस्थापन स्ट्रिंग को वापस करने के लिए किसी अन्य विधि को कॉल कर सकते हैं।

7

आप इस प्रकार का 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); 
    } 
} 
संबंधित मुद्दे