Laden...

Regex Rekursion

Letzter Beitrag vor 16 Jahren 7 Posts 1.240 Views
Regex Rekursion

Hallo Leute,

Ich schreibe derzeit ein Programm um Menüeinträge zu ihren Parent-Einträgen zurückzuverfolgen. Es gibt eine ParentID die ich immer per Regex rausfinde und dann die nächste Menügroup mit der ID finde. Wenn diese Group auch einen Parent hat möchte ich wieder, durch den schon angelegten Regex, die ID rausfinden und das gleiche noch mal machen. Dies möchte ich so lange machen bis die ParentID nur aus nullen besteht. Dabei möchte ich immer den Namen des Menüs abspeichern.

Am Ende soll das dann so aussehen:

Hauptmenü -> Bearbeiten -> Einfügen

Daher möchte ich diese Regex so lange ausführen bis ich 0000 bekomme.

Regex MenuRegex = new Regex("{.*?;" + ParentNodeID + ".*;Name=(.*?);.*?ParentNodeID=(.*?);");

Group 1 wäre hier der Name, Group 2 die ParentNodeID die dann wieder in die nächste Regex eingesetzt wird.

Habt ihr ne Ahnung wie man eine solche Schleife programmieren kann?

Hallo apid0x,

Regex.Matches
Match.NextMatch

herbivore

Hey herbivore,

Die Regex ändert sich ja dadurch das die neue ParentNodeID eingesetzt wird, daher werde ich kaum NextMatch verwenden können - oder? 🙂

Könnte ich dass mit "goto" erreichen?

Gruss,
apid0x

Hallo apid0x,

wenn der Pattern durch die ParentId bei jedem Schleifendurchlauf ein anderer ist, musst du eben jedes mal neu Regex.Match verwenden. Wo siehst du das Problem?

herbivore

Das Problem ist das ich im Grunde eine Art Rekursion erzeugen muss. Ich verwende für die neue Regex den Wert der alten. Und das ganze so lange bis die ParentID (dich ich immer weiter gebe) nur noch 000000000 ist.

Das habe ich versucht:

      recursion:
                                    {
                                        Regex NextNode = new Regex("{.*?;" + ParentNodeID + ".*?;Name=(.*?);.*?ParentNodeID=(.*?);");
                                        Match x = NextNode.Match(Menu[i].ToString());
                                        ParentNodeID = x.Groups[2].Value;
                                        MenusFound.Add(x.Groups[1].Value);
                                        if (ParentNodeID.Contains("00000000-0000-0000-0000-000000000000") == true)
                                        {

                                        }
                                        else
                                        {
                                            goto recursion;
                                        }
                                    }

So sieht eine Menüdefinition aus:

{ MenuItem       ;[{8AC7917D-2C91-457D-80D6-A24B42F71AE7}] ;Name=Chart of Accounts;
                                                                CaptionML=[DEU=Kontenplan;
                                                                           ENU=Chart of Accounts];
                                                                MemberOfMenu=[{F8D2429D-034B-4C58-9B5E-81BE962DB1BC}];
                                                                RunObjectType=Form;
                                                                RunObjectID=16;
                                                                ParentNodeID=[{B12180CF-0EFB-43AD-9118-7765E953AAFD}];

Hallo apid0x,

mir ist noch nicht klar, warum es eine Rekursion sein muss und nicht eine Schleife reicht.

Goto ist natürlich Mist .

Außerdem sieht mir das goto eher nach einer Schleife als nach einer Rekursion aus.

Siehe auch [Tipp] Anfängerfehler == true / == false.

herbivore

Okay ich habe mir mal deinen Rat zu Herzen genommen und versucht eine Schleife zu programmieren.

              while(!ParentNodeID.Contains("00000000-0000-0000-0000-000000000000"))
                                {
                                        Regex NextNode = new Regex(";" + ParentNodeID + ".*?;.*DEU=(.*?);.*?ParentNodeID=(.*?);", RegexOptions.Singleline);
                                        Match x = NextNode.Match(Menu[i].ToString());
                                        ParentNodeID = x.Groups[2].Value;
                                        MessageBox.Show(ParentNodeID); // Debug: ParentNodeID
                                        ParentNodeID = ParentNodeID.Replace("[", "\\["); 
                                        MessageBox.Show(x.Groups[1].Value); // Debug: Name
  
                                    
                                }

Das einzige Problem was ich jetzt noch zu haben scheine ist das irgendwas mit der Regex nicht stimmt. Ich habe sie schon mit dem Regex-Lab gecheckt und dort geht sie aber leider bin ich im Programm immer in einer Endlosschleife gefangen da immer die gleiche ParentID wie vorher zurückkommt.