मुझे C # Regex में कैप्चर किए गए समूहों का नाम कैसे मिलेगा?


98

क्या C # में पकड़े गए समूह का नाम पाने का कोई तरीका है?

string line = "No.123456789  04/09/2009  999";
Regex regex = new Regex(@"(?<number>[\d]{9})  (?<date>[\d]{2}/[\d]{2}/[\d]{4})  (?<code>.*)");

GroupCollection groups = regex.Match(line).Groups;

foreach (Group group in groups)
{
    Console.WriteLine("Group: {0}, Value: {1}", ???, group.Value);
}

मैं यह परिणाम प्राप्त करना चाहता हूं:

समूह: [मुझे नहीं पता कि यहाँ क्या जाना चाहिए], मूल्य: 123456789 04/09/2009 999
समूह: संख्या, मूल्य: 123456789
समूह: दिनांक, मान: 04/09/2009
समूह: कोड, मूल्य: 999

जवाबों:


128

GetGroupNames का उपयोग करेंसमूह संग्रह में कुंजी के रूप में नाम का उपयोग करते हुए, एक अभिव्यक्ति में समूहों की सूची प्राप्त करने और फिर उन पर पुनरावृत्ति करने के लिए का ।

उदाहरण के लिए,

GroupCollection groups = regex.Match(line).Groups;

foreach (string groupName in regex.GetGroupNames())
{
    Console.WriteLine(
       "Group: {0}, Value: {1}",
       groupName,
       groups[groupName].Value);
}

9
धन्यवाद! बिल्कुल वही जो मैं चाहता था। मैंने कभी नहीं सोचा था कि यह रेगेक्स ऑब्जेक्ट में होगा :(
लुइज़ डेमिम

22

इस विस्तार विधि का उपयोग करके ऐसा करने का सबसे साफ तरीका है:

public static class MyExtensionMethods
{
    public static Dictionary<string, string> MatchNamedCaptures(this Regex regex, string input)
    {
        var namedCaptureDictionary = new Dictionary<string, string>();
        GroupCollection groups = regex.Match(input).Groups;
        string [] groupNames = regex.GetGroupNames();
        foreach (string groupName in groupNames)
            if (groups[groupName].Captures.Count > 0)
                namedCaptureDictionary.Add(groupName,groups[groupName].Value);
        return namedCaptureDictionary;
    }
}


एक बार यह विस्तार विधि लागू होने के बाद, आप इस तरह से नाम और मान प्राप्त कर सकते हैं:

    var regex = new Regex(@"(?<year>[\d]+)\|(?<month>[\d]+)\|(?<day>[\d]+)");
    var namedCaptures = regex.MatchNamedCaptures(wikiDate);

    string s = "";
    foreach (var item in namedCaptures)
    {
        s += item.Key + ": " + item.Value + "\r\n";
    }

    s += namedCaptures["year"];
    s += namedCaptures["month"];
    s += namedCaptures["day"];


7

आपको उपयोग करना चाहिए GetGroupNames();और कोड कुछ इस तरह दिखाई देगा:

    string line = "No.123456789  04/09/2009  999";
    Regex regex = 
        new Regex(@"(?<number>[\d]{9})  (?<date>[\d]{2}/[\d]{2}/[\d]{4})  (?<code>.*)");

    GroupCollection groups = regex.Match(line).Groups;

    var grpNames = regex.GetGroupNames();

    foreach (var grpName in grpNames)
    {
        Console.WriteLine("Group: {0}, Value: {1}", grpName, groups[grpName].Value);
    }

0

रेगेक्स वर्ग इस की कुंजी है!

foreach(Group group in match.Groups)
{
    Console.WriteLine("Group: {0}, Value: {1}", regex.GroupNameFromNumber(group.Index), group.Value);
}

http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.groupnamefromnumber.aspx


10
यह गलत है, group.Indexमूल पाठ में मैच समूह की शुरुआत की स्थिति है। रेगेक्स में समूह का "इंडेक्स" नहीं।
13
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.