• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Die Bildungsoffensive hier im Forum geht weiter! Jetzt sollen Kreativität und technische Möglichkeiten einen neue Dimension erreichen. Das Thema in diesem Monat lautet - Verkehrte Welt - Hier geht es lang --> Klick

[RegEx] match ; aber nicht ü

  • Ersteller Ersteller svn
  • Erstellt am Erstellt am

svn

Prinzenapfel
Registriert
20.01.06
Beiträge
553
Hallo,
ich sitze seit Stunden an einem Problem.

Ich habe folgenden String:

rot;gelb;grün;blau

Wie teile ich den String mittels RegEx damit ich

rot
gelb
grün
blau

erhalte?
 
Mir kommt spontan folgendes in den Sinn:
erst ü in ü ersetzen
dann ; in \n ersetzen
dann wieder ü zurück in ü

gruss
Jonathan
 
Leider hab ich das voll $xxx; Programm an Html-Codes. :/
 
Es ist so nicht möglich wie du das willst, dafür bräuchtest du eine look behind assertion mit variabler lenge:
/(?<!&\w+);/ (An semicolon teilen, es sei denn, es ist ein & und eine variable menge buchstaben davor...

Aber mit einer match-Regex kann man alle (auch die mit mehreren &umlauten; ) finden:

Code:
/((?:\w*&\w+;\w*)*|\w+)(?:;|$)/g

Beispiel (in perl):
Code:
C:\Users\Maluku>perl -e "$a='rot;gelb;gr&uuml;n;blau;gr&uuml;ngr&auml;ulich';print $1,qq(\n) while $a=~/((?:\w*&\w+;\w*)*|\w+)(?:;|$)/g"
rot
gelb
gr&uuml;n
blau
gr&uuml;ngr&auml;ulich
Erklärung: Füllte die erste Match Gruppe ($1 in perl) mit entweder einer beliebigen Menge an \w*&\w+;\w* (d.h.) HTML-Entities mit Buchstaben drumrum oder einem Wort ohne Umlaute: \w+
Die (?: ... )* um die erste Gruppe ist nur zur Gruppierung, damit man den Sachen vermehrfachen kann.
Das ganze bis zu einem ; oder Stringende ($)

Wenn du auch noch Leerzeichen oder andere Sonderzeichen im String hast, dann musst du die Regex so anpassen:
Code:
/((?:[^;]*&\w+;[^;&]*)*|[^;]+)(?:;|$)/g
Beispiel:
Code:
C:\Users\Maluku>perl -e "$a='rot;gelb;gr&uuml;n;blau;gr&uuml;ngr&auml;ulich;g&uuml;n und grell (eher gr&uuml;n als grell)';print $1,qq(\n) while $a=~/((?:[^;]*&\w+;[^;&]*)*|[^;]+)(?:;|$)/g"
rot
gelb
gr&uuml;n
blau
gr&uuml;ngr&auml;ulich
g&uuml;n und grell (eher gr&uuml;n als grell)
 
  • Like
Reaktionen: svn