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
Hallo Christoph1968.
genau hab ichs nicht verstanden, aber mit einem MatchEvaluator solltest du das wohl hinbekommen.
herbivore
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
Wenn ich dich recht verstehe müsste das über Backreferences gehen.
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
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
Hallo Herbivore,
ich glaube ganz dunkel beginnt es zu daemmern.
Vielen Dank Dir,
damit kann ich jetzt mal spielen.
Grüße
Christoph
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
Hallo Christoph1968,
ja und nein:
string variable_3 = match.Groups["variable_1"].Value + match.Groups["variable_2"].Value;
herbivore
Hallo Herbivore,
das war eigentlich, was ich wissen wollte. Mit dem Regex alleine kriegt man das nicht hin.
Danke Dir
Christoph
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