Thread Doppelbuchstaben umklammern (war: Help)
(22 answers)
Opened by Gast at 2006-04-10 16:52 Quote Man man man, du hast jetzt mein regex leben auf dem Kopf gestellt. ;) Jetzt befasse ich mich schon so intensiv mit Regexe, und mir ist das bisher nicht aufgefallen. Anhand dieser Tatsache ist dann "\w" wirklich ungeeignet, und eine Posix zeichenklasse ist dafür dann deutlich besser geeignet. Quote Ne, leider nicht. Unicode und UTF-8 / UTF-16 sind zwei unterschiedliche Dinge. Unicode selber ist eine Zuordnung zwischen Zeichen und Zahlen. Allerdings kann, und es ist auch so. Das andere Unicode Zeichen wiederum aus mehrere Unicode Zeichen zusammengesetzt sind. Diese Unicode zeichen müssen letztendlich auf dem Bildschirm angezeigt werden. Dafür gibt es dann UTF-8 und UTF-16. Allerdings bedeutet es nicht das ein und das selbe Zeichen die gleichen bytesequenz in den verschieden Codierungen wie UTF-8 / UTF-16 / UCS-2 / UCS-4 besitzt. Ein und das selbe Zeichen hat unterschiedliche Codierungen in UTF-8, UTF-16... aber trotzdem eine fest zugewiesene Unicode Codierung. Nehmen wir als Beispiel folgendes zeichen "á", (eigentlich wollte ich den Strich von links oben nach unten aber ist für das beispiel irrelevant). Das ganze setzt sich aus 2 Unicode Zeichen zusammen. U+0061 und U+0300. In UTF-8 existiert dafür aber nur eine Bytecodierung. Das Problem ist jetzt wenn du dieses zeichen direkt in einer Regex schreiben würdest, z.b in einer zeichenklasse, dann wäre es das selbe als wenn du "[a`]" schreiben würdest. Du erkennst auf einmal zwei zeichen, nämlich ein normales a, und einmal das hochkomma. Aber nicht das zusammengesetzt Zeichen á. Das liegt darin das die UTF-8 Codierung das ganze in die beiden Unicode Zeichen umwandelt. Also "U+0300+U+0061", und jetzt jedes zeichen einzeln erkennt, und nciht beide zeichen zusammen zu einem zeichen. Das gleiche Problem existiert bei dem "." oder "\w". "^.$" würde z.B. nicht auf "á" passen. Da es in Unicode zwei Zeichen sind, und der Punkt nur eins erkennt. Der Punkt erkennt hier nicht das beide Unicode zeichen eigentlich ein zeichen darstellen. "^..$" wäre aber in der Lage auf "á" zu matchen. Oder man benutzt eben "\X", dass solche zusammengesetzte Zeichen (combining characters) erkennt. "^\X$" würde also auf "á" matchen. Und es können noch komplexere Zeichen aus mehreren Unicode Zeichen erkannt werden. "\X" erkennt das hier als ein zeichen. Das ist nicht mit UTF-8 zu verwechseln. Den für jedes Zeichen gibt es zwar nur eine Bytefolge, es kann aber trotzdem aus mehrere Unicode Zeichen bestehen. und perl arbeitet auf unicode ebene. Noch Lustiger ist es wenn du so ein zeichen schreibst und ein Quantor benutzt. "á+" Das erkennt nicht mehrere "á", sondern ein "a" gefolgt von mindestens ein und mehrere "`". Quelle: Buch Reguläre Ausdrücke. Deutsche Ausgabe. 2. Auflage S. 109ff.\n\n <!--EDIT|sid burn|1144744057--> Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
|