Tja, mal wieder treiben mich reguläre Ausdrücke zum Wahnsinn.
Ich will einen regulären Ausdrück für folgendes. Ich habe z.B. eine Zeile ähnlich einer Variablenzuweisung in PHP, sowas wie
muh = "eek";
Was ich jetzt möchte ist eek auslesen. Das an sich ist nicht so schwer. Problematisch wird es dann aber wenn folgendes dazu kommt:
1) eek kann auch ein mehrzeiliger Text sein (newlines sind keine Begrenzungen)
2) " können auch durch ' ersetzt werden
3) Nach der Zeile können noch ähnliche Zeilen auftauchen, ich muss also aufpassen das nicht zuviel gematcht wird
So ... ich hatte es jetzt probiert mit folgendem Regexp:
/^[a-z0-9\._-]+ *= *("|\')[^\1]+\1 *;/ims
Um euch das lesen etwas zu vereinfachen:
^[a-z0-9\._-]+: Am Anfang des Strings kommt der "Variablenname" der nur aus den angegeben zeichen bestehen darf
Danach kommen beliebig viele Whitespaces
Dann ein =
Dann wieder beliebige Whitespaces
Dann entweder ein " oder '
Jetzt soll jedes beliebige Zeichen kommen außer " oder ', je nachdem was gematcht wurde
Dann ein " oder ', je nachdem was gematcht wurde
Wieder mal beliebig viele Whitespaces
Schließlich ein ;
So, das Problem: Diese "Back References", also das \1, funktionieren nicht in eckigen Klammern.
Lange Rede kurzer Sinn: Gibt es dafür ein Workaround oder hat jemand evtl. sogar einen besseren Ansatz für mein Problem? Das Problem ist ganz einfach das ich verbieten muss das " oder ' (je nachdem was eben eingesetzt wird um die Zeichenkette zu begrenzen) in der Zeichenkette vorkommen, da ich sonst schwachsinnige Ergebnisse kriege.
der U-Modifier ist leider auch keine Lösung, da ich später noch escaping einbauen will. Und bei U würde sowas wie
muh = "ee\"k";
nur bis vor das k gematcht werden.
Naja: Ideen?
Danke
BlackWolf
Ich will einen regulären Ausdrück für folgendes. Ich habe z.B. eine Zeile ähnlich einer Variablenzuweisung in PHP, sowas wie
muh = "eek";
Was ich jetzt möchte ist eek auslesen. Das an sich ist nicht so schwer. Problematisch wird es dann aber wenn folgendes dazu kommt:
1) eek kann auch ein mehrzeiliger Text sein (newlines sind keine Begrenzungen)
2) " können auch durch ' ersetzt werden
3) Nach der Zeile können noch ähnliche Zeilen auftauchen, ich muss also aufpassen das nicht zuviel gematcht wird
So ... ich hatte es jetzt probiert mit folgendem Regexp:
/^[a-z0-9\._-]+ *= *("|\')[^\1]+\1 *;/ims
Um euch das lesen etwas zu vereinfachen:
^[a-z0-9\._-]+: Am Anfang des Strings kommt der "Variablenname" der nur aus den angegeben zeichen bestehen darf
Danach kommen beliebig viele Whitespaces
Dann ein =
Dann wieder beliebige Whitespaces
Dann entweder ein " oder '
Jetzt soll jedes beliebige Zeichen kommen außer " oder ', je nachdem was gematcht wurde
Dann ein " oder ', je nachdem was gematcht wurde
Wieder mal beliebig viele Whitespaces
Schließlich ein ;
So, das Problem: Diese "Back References", also das \1, funktionieren nicht in eckigen Klammern.
Lange Rede kurzer Sinn: Gibt es dafür ein Workaround oder hat jemand evtl. sogar einen besseren Ansatz für mein Problem? Das Problem ist ganz einfach das ich verbieten muss das " oder ' (je nachdem was eben eingesetzt wird um die Zeichenkette zu begrenzen) in der Zeichenkette vorkommen, da ich sonst schwachsinnige Ergebnisse kriege.
der U-Modifier ist leider auch keine Lösung, da ich später noch escaping einbauen will. Und bei U würde sowas wie
muh = "ee\"k";
nur bis vor das k gematcht werden.
Naja: Ideen?
Danke
BlackWolf
Kommentar