Donnerstag, 27. Januar 2011

RegEx: Beware of the evil umlaut!

Manche Fehler sind so wie das Stolpern des Butlers in "Dinner for one": Immer wieder die gleiche Situation, immer wieder der gleiche Fehler. Gerade bei regulären Ausdrücken gibt es einige solcher offensichtlichen, aber ärgerlichen Fallen. Eine wollen wir uns kurz ansehen.

Reguläre Ausdrücke kennen sogenannte Zeichenklassen. "\d" ist eine Ziffer, also 0,1,2,3,4,5,6,7,8 oder 9.
"\w" ist ein Wortzeichen, vereinfacht gesagt ein Buchstabe, eine Zahl oder (warum auch immer) ein Unterstrich.

Ein einfacher regulärer Ausdruck in der Form "/\w,/" sucht also ein Wortzeichen, dass von einem Komma gefolgt wird.
Wir suchen aber nicht nur einen Buchstaben, sondern ein ganzes Wort: Durch ein "*" nach dem "\w" erlauben wir nicht nur ein Zeichen, sondern viele - eben ein ganzes Wort.

Haben wir als String beispielsweise folgenden Text:
"Such friends, as the Beaver and Butcher became, have seldom if ever been known"*.
Dann erhalten wir als erwartetes Ergebnis "friends,".
Da uns das Komma eigentlich gar nicht wirklich interessiert, definieren wir mit runden Klammern eine sogenannte Suchgruppe, so etwas wie ein Teilergebnis, dass wir auch getrennt abfragen können: "/(\w*),/"

In PHP sieht das dann so aus:
 $Suchtext = "Such friends, as the Beaver and Butcher became, have seldom if ever been known";
 preg_match("/(\w*),/", $Suchtext, $Ergebnis);
 
 echo 'Alles: '.$Ergebnis[0];
 echo 'Die erste und einzige Suchgruppe: '.$Ergebnis[1];
So weit, so gut. Jetzt nehmen wir einen beliebigen deutschen Text:
$Suchtext = "Ich bin der Bäcker, ich knete den Teig.";
Und vielleicht nicht ganz erwartungsgemäß ist unser Ergebnis "cker,", bzw. "cker" für die erste (und einzige) Suchgruppe.

Was ist passiert?

Ganz einfach: Umlaute gehören nicht zur Zeichenklasse "\w".
Wir müssen deshalb unseren regulären Ausdruck erweitern, so zum Beispiel: "/([\wöäüÖÄÜß]*),/"
Mit den eckigen Klammern "[]" legen wir unterschiedliche, erlaubte Zeichen fest.

Natürlich gibt es noch unzählige andere, sicher auch bessere Möglichkeiten einen passenden regulären Ausdruck zu basteln, aber vielleicht hilft der Hinweis nicht ausgerechnet in diese lästige Falle zu tappen.

*"The Hunting of the Snark" von Lewis Carroll.

Keine Kommentare:

Kommentar veröffentlichen