RegExp gesucht
Andreas Hecht
- php
0 Eidgenosse0 Andreas Hecht0 Eidgenosse0 Andreas Hecht0 Cheatah
Ich wälze schon seit Stunden diverse Manuale und Webseiten, ohne zu einer Lösung gekommen zu sein, deshalb meine Frage an die RegExperten:
Gesucht ist ein (perl-kompatibler) RegExp, der auf eine Zeichenkette innerhalb eines längeren Strings passt, deren Anfang und Ende bekannt sind, die aber eine bestimmte Zeichenkette (an beliebiger Position) NICHT enthält.
Also etwas in der Art wie /aa[^b]+cc/, nur dass ich eben anstelle des "b" eine Zeichenkette brauche, die nicht vorkommen darf.
TIA,
Andreas
Hallo Andreas,
vielleicht geht es so
/Nur(?!.*Koelsch).*gut/
erkennt
"Nur Alt schmeckt wirklich gut"
aber nicht
"Nur Koelsch schmeckt wirklich gut".
Gruß
Eidgenosse
Hallo Eidgenosse,
/Nur(?!.*Koelsch).*gut/
erkennt
"Nur Alt schmeckt wirklich gut"
aber nicht
"Nur Koelsch schmeckt wirklich gut".
Danke, aber so klappts nicht.
Diese Lösung erkennt nämlich auch die Variante
"Nur das echte Kölsch schmeckt wirklich gut"
und das sollte sie eben nicht. Mit lookahead oder lookbehind bin ich
irgendwie auch nicht zum Ziel gekommen.
Trotzdem danke,
Andreas
Hallo Andreas,
bie mir funktioniert es - vielleicht liegts an der Version. Andernfalls könnte auch das helfen:
if($string=~/Nur(.*)gut/ and $1 !~ /Koelsch/) {
print "Koelsch schmeckt wirklich nicht.\n";
}
Gruß
Eidgenosse
Vielleicht hab ich das Problem etwas vage erklärt. Ich mache eine Serienersetzung in einem längeren Text, der etwa folgende Passage enthält (\n für linebreak):
[..]
\n
Herauskommen sollen gültige HTML-Listen (<ol> bzw. <ul>) mit einfach geschachtelten Unterlisten. Die Schritte:
1. Alle "\n\n- ([^\n]+)" werden zu <ul><li>\1</li>
2. Alle "\n\n[0-9]+ ([^\n]+)" werden zu <ol><li>\1</li>
3. Alle "\n- ([^\n]+)" werden zu <li>\1</li>
4. Alle "<ul>(.*)\n\n" werden zu <ul>\1</ul> (das geht gerade noch)
5. Alle "<ol>(.*)\n\n" sollen zu <ol>\1</ol> werden - und das geht eben nicht mehr, wegen der Schachtelung.
regards,
Andreas
Hi,
Herauskommen sollen gültige HTML-Listen (<ol> bzw. <ul>) mit einfach geschachtelten Unterlisten. Die Schritte:
wenn Du schon mit mehreren Schritten arbeitest, ist es nicht mehr weit zu einem "richtigen" Algorithmus. Gehe die Zeilen nach und nach durch, betrachte sie _einzeln_ in Abhängigkeit vom Kontext (sprich: merke Dir relevante Zustände), generiere den für _diese_ Zeile _und_ den Kontext notwendigen Code.
Ein möglicher Zustand, den Du Dir merken kannst, ist beispielsweise die ermittelte Schachtelungstiefe.
Cheatah
Cheatah wrote:
wenn Du schon mit mehreren Schritten arbeitest, ist es nicht mehr
weit zu einem "richtigen" Algorithmus.
Ein RegExp ist die Beschreibung eines Algorithmus. Ich weiss recht genau, was er tun soll, ich hab nur Probleme mit der Syntax.
regards,
Andreas
Hi,
wenn Du schon mit mehreren Schritten arbeitest, ist es nicht mehr
weit zu einem "richtigen" Algorithmus.
Ein RegExp ist die Beschreibung eines Algorithmus.
beachte die Anführungszeichen in meinem vorherigen Satz.
Ich weiss recht genau, was er tun soll, ich hab nur Probleme mit der Syntax.
Meine Empfehlung lautet, den Algorithmus _nicht_ auf einer Reihe von Regular Expressions aufzubauen. Wenn Du innerhalb des Algorithmus' RegExp verwendest, ist das nicht falsch; aber diese sind nicht immer das Allheilmittel zum Zweck.
Cheatah
Hallo Andreas,
Ein RegExp ist die Beschreibung eines Algorithmus.
Das kann ich so nicht stehen lassen. Ein RegEx beschreibt
keinen Algorithmus, ein RegEx beschreibt eine Gramatik bzw.
eine Syntax (je nach Zusammenhang).
Gruesse,
CK