C# CaptureGroup Nummer aus Regex Match ermitteln

Smagjus

Vice Admiral
Registriert
Feb. 2011
Beiträge
6.148
Hallo zusammen,

ich bin gerade dabei mich fit zu machen was Regex angeht und stehe an einer Stelle ziemlich auf dem Schlauch. Ich habe einen Regex mit 3 definierten Gruppen und wende diesesn auf einen String an. Nun möchte ich neben dem match.value und match.index auch die Nummer der Gruppe erfahren, die auf mein jeweiliges Match zutrifft. Ist das ohne weiteres möglich? Ich hab das Gefühl ich versteh etwas grundlegendes an den Gruppen nicht und komme deshalb nicht auf die Lösung. Es wäre nett, wenn mir das Brett vorm Kopf entfernen könnte :)

Die heikle Stelle im Code habe ich mal mit drei ??? markiert, damit man weiß, was ich möchte.

Code:
static void Main(string[] args)        {
            String test = "sdgfhdgst<tag sdedgfgf attr=\"test\" fdghsdgsgfdd> valuevaluevalue </tag> \n safasdf sdfsdafdf \t <tag>sdagfsadfsdf</tag>";

            String tagname = "tag";
            String start = "<" + tagname + "[^<>]*>";
            String end = "</" + tagname + ">";
            String empty = "<" + tagname + "[^<>]*/>";
            
            Regex regex = new Regex(@"(" + start + ")|(" + end + ")|(" + empty + ")");
            MatchCollection mc = regex.Matches(test);


            foreach (Match match in mc)
            {
                Console.WriteLine("{0} found at {1}.\n[B]Capturegroup is {2}.", match.Value, match.Index, "???");                                
            }
​
            Console.Read();
        }
 
Code:
match.Groups["TEXT"]
so?
 
Danke für die Hilfe, aber da meine Groups namenlos sind, kann ich sie darüber nicht ansprechen. Ich habe aber selber eine Lösung geschustert, die mir zwar nicht gefällt, aber funktioniert.

Code:
Console.WriteLine("{0} found at {1}.\nCapturegroup is {2}.", match.Value, match.Index, Number(match.Groups));                          


        static int Number(GroupCollection groups)
        {
            for (int i = 1; i < groups.Count; i++)
                if (groups[i].Value != String.Empty)
                    return i;
            return -1;
        }
Die Group Collection enthält das gefundene Element immer unter dem Index bereit, der der Nummer der Group entspricht. Nummer 0 ist dabei ein Sonderfall, der sowohl Elemente enthält, wenn sie einer Group zugehörig sind, als auch, wenn sie keine Gruppenzuweisung haben.

Das Konzept dahinter, erschließt sich mir zwar noch nicht, aber zumindest kann ich es mir zu Nutze machen.

Der Output ist nun folgender:

Code:
<tag sdedgfgf attr="test" fdghsdgsgfdd> found at 9.
Capturegroup is 1.


</tag> found at 65.
Capturegroup is 2.


<tag> found at 94.
Capturegroup is 1.


</tag> found at 111.
Capturegroup is 2.
 
Zurück
Oben