Thread Zeichen in RegEx darf nicht zwischen <> stehen
(26 answers)
Opened by Matze at 2006-04-18 11:40 Quote Wenn es ein einzelnes Zeichen ist dann kannst du eine negierte Zeichenklasse dafür verwenden: [^abc] Das matcht auf jedes Zeichen das nicht a,b oder c ist. Soll mehr als ein Zeichen nicht erkannt werden, ein String etc. empfiehlt sich ein Negatives Lookahead. hallo(?!, welt) Das Bedeutet das nach einem hallo nicht die Zeichenkette ", welt" folgen darf. Allerdings gibt es bei Lookaaround Konstrukt noch einiges mehr zu beachten. Sie selber passen immer nur auf Positionen, nehmen aber nie Text ein. Das würde z.B. nur das "Hallo" durch nichts ersetzen. Zwar wird überprüft ob nach dem Hallo ein " Welt" folgt, allerdings wird dieses Welt nicht erfasst. Nur "Hallo" zählt als match auf dem die Substitution angewendet wird. (Genauer: Nach "Hallo" steht die Regex Maschiene auf der Position zwischen "o" und dem Leerzeichen. Es wird überprüft ob von dieser Position aus gesehen das " Welt" vorkommt. Ist dies der Fall matcht die Position, da dies die komplette Regex ist, ist das matching vorbei, und eine ersetzung findet statt. Das Lokkahed Konstrukt hat aber letztlich nur auf eine bestimmte Position geprüft und kein Text erkannt. Würde danach kein " Welt" kommen würde die Position nicht stimmen, und die Regex Maschine würde wieder nach der Zeichenfolge "Hallo" suchen und ob die Position danach auch matcht. Nur wenn das der Fall ist findet eine Substitution statt. Vielleicht ist die genaue Beschreibung etwas Verständlicher.) Ansonsten ist es in deinem Fall ja etwas schwerer zu erkennen was wirklich gemeint ist. Du sagst zwischen spitzen Klammern darf es nicht vorkommen. Was du aber denke ich wirklich meinst ist das es nicht innerhalb eines HTML Tags eretzt werden darf. Deine Aussage ist da nicht genau genug, und das sind ziemlich große Unterschiede. Zwischen spitzen Klammern wäre auch folgendes: Code: (dl
)
print "<", 1234, ">"; Was aber sicherlich kein HTML Tag ist. Quote Deine Regex erkennt das selbe, egal ob nun Substiution oder ein Match. Weiterhin wenn du keins von den folgenden drei Zeichen benutzt: ^$. dann ist es volkommen egal ob der String aus mehreren Logischen Zeilen besteht oder nicht. Deine Regex wird immer auf den ganzen String angewendet. Der Punkt passt auf alles, auser dem Newline Zeichen. Das heißt wenn du den Punkt in deiner Regex benutzt, und du möchtest das er über mehrere Logische Zeilen hinweg geht, dann musst du die /s Option benutzen. Aber nur wenn du den Punkt benutzt. Wenn du ihn nicht benutzt hat dies kein Effekt auf den String oder die Regex. Ansonsten passt ^ und $ Stadardmäßig auf String Anfang und String Ende. (Nicht Zeilenanfang und Zeilenende). Manchmal ist es aber gewünscht das du logische Zeilen erkennst, wenn das gewünscht ist musst du die Option /m benutzen. Dadurch passt das ^ kurz nach einem Newline Zeichen (oder String Anfang), und $ kurz vor einem Newline Zeichen (oder String Ende). Die Zeilen werden dadurch also Simuliert. Ansonsten ist es deiner Regex ziemlich egal ob dein String nun mehrere logische Zeilen besitzt oder nicht. Es wird immer der String bearbeitet, keine Zeilen. Quote Was hast du den damit ausprobiert? Also erstens muss man hier kritisch sagen, dass du diese Variablen nicht verwenden solltest. Das hat mit PErformance zu tun, den die geht damit drastisch in den keller. Vor allem wenn du mehrere Module und viele Regexe benutzt. Ansonsten erkennen diese Zeichen nach einem Match was vor dem Match und nach einem Match stand. Es gibt noch eine dritte Variable $& die erkennt genau das, auf was die Regex gematcht hat. Sagen wir du hast folgenden String "Hallo 123 Welt". Und deine Regex schaut folgendermaßen aus \d+. Dann sind die Variablen nach deinem match folgendermaßen gefüllt. Allerdings werden diese Variablen nicht nur nach dem Match gefüllt, sondern nach absolut jedem Zeichen das deine Regex neu erkennt, für jeden Backtracking Versuch etc. Und wenn du diese Variablen einmal benutzt wird dieses verhalten gleich für absolut jede Regex in absolut jedem Modul im komplett Programm aktiviert. Das kostet viel Performance. Quote Hättest du von Anfang an gesagt das es sich hier nur um Werte innerhalb von Anführungszeichen geht dann wäre das alles deutlich einfacher gewesen.... Vielleicht solltest nochmal genau beschreiben was du überhaupt genau haben möchtest, und vielleicht auch mal direkt deine Beispieldatei Posten (sofern das geht) damit man direkt damit arbeiten kann, oder generell BEschreiben was du da überhaupt für eine Datei hast. Wenn man Reguläre Ausdrücke schreibt dann muss man zu 100% Wissen wie die Daten aussehen, und alle Möglichen Fälle abdecken die Auftreten könnten, wenn man das nicht beachtet geht es früher oder später irgendwann in die Hose. Wenn eine Ersetzung nur Innerhlab von Anführungszeichen stattfindet dann ist das shcon ein guter Punkt der das ganze einfacher macht, das ganze reicht aber trotzdem nicht aus. Welche Sprache benutzt du? Was ist wenn du ein Anführungszeichen innerhlab eines Strings schreiben möchtest? Wird das dann z.B. mit einem Backslash davor escaped? [\"] Wenn es sich um einen String handelt, ist es dann die einzige Möglichkeit wie ein String definiert wird? In den meisten Sprachen gibt es auch immer ein einzelnes Hochkomma, das müsste auch Berücksichtigt werden. (Bei Perl gibt es sogar noch die q und qq Oberatoren mit Variablen Zeichen, darüber darf man gar nicht erst nachdenken...) Gibt es Kommentare? Wenn ja wie sehen diese aus? Dort möchtest du sicherlich auch keine Sachen ersetzen. Solche Sachen muss man Berücksichtigen beim Schreiben einer Regex. Auch wenn man zu Anfang denkt das sowas wie Ersetzen zwischen Anführungszeichen recht einfach geht. Wenn du keine genauen Informationen lieferst geht sowas schlecht. Allerdings hängt es immer auch davon ab wofür du soetwas benötigst. Wenn es eine einmalige Aktion ist, kannst du auch eine unpräzise Möglichkeit nehmen, und danach nochmal über die Datei drüber schauen, wenn du irgendetwas automatisieren möchtest, und auf Korrektheit ankommt, dann geht sowas nicht.\n\n <!--EDIT|sid burn|1145558717--> Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
|