ฉันจะได้รับชื่อของกลุ่มที่บันทึกใน 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/2552
กลุ่ม: รหัส, มูลค่า: 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
ขอบคุณ! สิ่งที่ฉันต้องการ ฉันไม่เคยคิดเลยว่าสิ่งนี้จะอยู่ในวัตถุ Regex :(
Luiz Damim

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

คลาส Regex เป็นกุญแจสำคัญในการนี้!

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ตำแหน่งของจุดเริ่มต้นของกลุ่มการจับคู่ในข้อความต้นฉบับ ไม่ใช่ "ดัชนี" ของกลุ่มใน regex
squig
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.