Laden...

Innerhalb eines RegEx gefundene Gruppe in andere Gruppe wiedereinsetzen

Erstellt von Christoph1968 vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.241 Views
C
Christoph1968 Themenstarter:in
93 Beiträge seit 2007
vor 14 Jahren
Innerhalb eines RegEx gefundene Gruppe in andere Gruppe wiedereinsetzen

Hallo zusammen,

ich hab ein etwas ungewöhnliches Anliegen

Ein Programm wertet einen regulaeren Ausdruck aus, um
verschiedene Variablen zu belegen

(?<variable_1>\d{5})...(?<variable_2>[A-Z]{12})$

Was jetzt im einzelnen mit den durch die Bezeichner variable_1 und variable_2
geschieht, entzieht sich meiner Kenntnis, ich habe weder die Moeglichkeit den
Quellcode einzulesen, noch ihn zu aendern.

Die einzige Moeglichkeit, die ich habe, ist die Musterdefinition des Regulaeren Ausdrucks.

Meine Frage ist nun, ich muesste jetzt eine 3.Variable definieren variable_3,
die sich zusammensetzt aus den in variable_1 und variable_2 gespeicherten Zeichenketten

So ungefaehr nach dem Motto

(?<variable_1>\d{5})...(?<variable_2>[A-Z]{12})(?<variable_3>=\k<variable_1>\k<variable_2)$

Ich muss / moechte eine Variable liefern, die nicht explizit in der auszuwertenden Zeichenkette vorhanden ist, sondern sich aus 2 in der Zeichenkette voneinander unabhaengigen Fragmenten zusammensetzt.

Geht so etwas prinzipiell ?

Vielen Dank

Christoph

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Christoph1968.

genau hab ichs nicht verstanden, aber mit einem MatchEvaluator solltest du das wohl hinbekommen.

herbivore

C
Christoph1968 Themenstarter:in
93 Beiträge seit 2007
vor 14 Jahren

Hallo Herbivore

vielen Dank fuer Deine Antwort,
ja, das Thema ist auch ein bißchen verzwickt.
Die Kernfrage ist, ob ich einer variable_3 innerhalb der Patterndefinition
die Zeichenkette der variable_1 und der variable_2 quasi explizit zuweisen kann ?

Ich moechte herausbekommen, ob ich dieses Problem nur ueber die Patterndefinition loesen kann, eine Anpassung der Software ist gerade das, was ich vermeiden will.

Christoph

M
120 Beiträge seit 2009
vor 14 Jahren

Wenn ich dich recht verstehe müsste das über Backreferences gehen.

C
Christoph1968 Themenstarter:in
93 Beiträge seit 2007
vor 14 Jahren

Hallo Marsti,

das war schon ein gutes Stichwort, und ich habe zumindest fogendes erreicht:


   Regex regEx = new Regex(@"(?<variable_1>\d{3})(?<variable_2>[A-Z]{5})(?<variable_3>\k<variable_1>\k<variable_2>)");

            string teststring = "123ABCDE123ABCDE";

            MatchCollection treffer = regEx.Matches(teststring);

            foreach (Match match in treffer)
            {
                string variable_1 = match.Groups["variable_1"].Value; // 123
                string variable_2 = match.Groups["variable_2"].Value; // ABCDE
                string variable_3 = match.Groups["variable_3"].Value; // ABCDE123
            }

Das Problem ist jetzt nur, dass die Zeichenkette nur aus "123ABCDE" besteht,
nicht wie im Beispiel aus "123ABCDE123ABCDE", und dann der RegEx natuerlich nichts findet.

Kann ich in einem Pattern angeben, die uebergebene Zeichenkette zweimal zu durchsuchen ?

Grüße

Christoph

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Christoph1968,

naja, du kannst Backreferenzen auch mehrfach angeben oder du definierst um den gesamten bisherigen Pattern eine Gruppe, die du dann wiederum backreferenzierst.

herbivore

C
Christoph1968 Themenstarter:in
93 Beiträge seit 2007
vor 14 Jahren

Hallo Herbivore,

ich glaube ganz dunkel beginnt es zu daemmern.

Vielen Dank Dir,

damit kann ich jetzt mal spielen.

Grüße

Christoph

C
Christoph1968 Themenstarter:in
93 Beiträge seit 2007
vor 14 Jahren

Hallo,

tut mir leid, ich steh anscheinend immer noch auf dem Schlauch,
oder schaffe es einfach nicht, mich richtig auszudruecken


    Regex regEx = new Regex (@"(?<variable_0>(?<variable_3>(?<variable_1>\d{3})(.*)(?<variable_2>[A-Z]{5}))" + @"(?<variable_5>.*)(?<variable_4>[A-Z]{5}))");
            string teststring = "123das_soll_nicht_in_variable_3_erscheinenABCDEtestomatFGHIJ";

            MatchCollection treffer = regEx.Matches(teststring);

            foreach (Match match in treffer)
            {
                string variable_0 = match.Groups["variable_0"].Value; // 123das_soll_nicht_in_variable_3_erscheinenABCDEtestomatFGHIJ
                string variable_1 = match.Groups["variable_1"].Value; // 123
                string variable_2 = match.Groups["variable_2"].Value; // ABCDE
                string variable_3 = match.Groups["variable_3"].Value; // 123das_soll_nicht_in_variable_3_ersecheinenABCDE Ich braeuchte hier nur "123ABCDE"
                string variable_4 = match.Groups["variable_4"].Value; // FGHIJ
                string variable_5 = match.Groups["variable_5"].Value; // testomat

            }

Ist es moeglich, bei gegebener Zeichenkette, ein Pattern zu formulieren,
das der variable_3 den Wert "123ABCDE" zuweist ?

Vielen Dank nochmals.

Grüße

Christoph

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Christoph1968,

ja und nein:

string variable_3 = match.Groups["variable_1"].Value + match.Groups["variable_2"].Value;

herbivore

C
Christoph1968 Themenstarter:in
93 Beiträge seit 2007
vor 14 Jahren

Hallo Herbivore,

das war eigentlich, was ich wissen wollte. Mit dem Regex alleine kriegt man das nicht hin.

Danke Dir

Christoph

1.361 Beiträge seit 2007
vor 14 Jahren

Hi,

Mit dem Regex alleine kriegt man das nicht hin.

naja man kanns zumindest mit den Regex-Klassen allein hinkriegen:


match.Result("${variable_1}${variable_2}")

Die Syntax ist die von Regex.Replace.

Im Grunde nix anderes, allerdings etwas kompakter als

String.Format("...", match.Groups[....].Value, match.Groups[....].Value)

beste Grüße
zommi