Leerzeichen am Anfang und am Ende entfernen

(Auszug aus "Reguläre Ausdrücke" von Jeffrey E. F. Friedl)

Das Entfernen von Leerzeichen am Anfang und am Ende eines Strings ist nun wirklich keine große Herausforderung, aber das Problem taucht immer wieder auf. Die mit Abstand beste Lösung für dieses Problem ist die einfache und offensichtliche:

s/^\s+//;
s/\s+$//;

Als kleine Optimierung wird hier ˹+˼ statt ˹*˼ benutzt, weil man die Substitution besser gar nicht ausführt, wenn es nichts zu entfernen gibt.

Aus welchen Gründen auch immer scheint es die Herausforderung zu sein, eine Lösung zu finden, die beides in einem Schritt erledigt. Ich empfehle so etwas nicht, aber es ist aufschlussreich zu sehen, wie solche Lösungsansätze funktionieren und warum sie nicht zu empfehlen sind.

s/\s*(.*?)\s*$/$1/s

Als die nicht-gierigen Quantoren neu waren, war dies das Paradebeispiel; in der Zwischenzeit hat man gemerkt, dass diese Lösung viel langsamer ist als die einfache (in Perl etwa fünfmal langsamer). Das liegt daran, dass bei jedem Zeichen getestet werden muss, ob das auf *? Folgende passen kann. Das erfordert eine große Menge von Backtracking-Vorgängen.

s/^\s*((?:.*\S)?)\s*$/$1/s

Das sieht viel komplizierter als die vorherige Lösung aus, aber die Mustersuche verläuft hier viel geradliniger und ist nur noch etwa doppelt so langsam wie die kanonische Lösung. Mit ˹^\s*˼ wird der Whitespace am Anfang übersprungen, und das ˹.*˼ in der Mitte erkennt alle Zeichen bis zum Stringende. Mit dem ˹\S˼ wird Backtracking bis zum letzten Nicht-Whitespace-Zeichen erzwungen. Der Whitespace am Ende wird von ˹\s*$˼ erkannt, das außerhalb der einfangenden Klammern steht.

Das Fragezeichen ist notwendig, damit der Ausdruck auch bei Zeilen funktioniert, die nur Whitespace enthalten. Ohne das Fragezeichen würde die Regex fehlschlagen, und die Zeile würde die Leerzeilen behalten.

s/^\s*|\s*$//g

Dies ist eine häufig vorgeschlagene Lösung: Sie ist nicht falsch (keine der hier vorgestellten Lösungen ist falsch), aber die Alternation verhindert eine Reihe von sonst möglichen Optimierungen.

Der /g-Modifikator wird benutzt, damit beide Alternativen passen können, aber /g scheint mir etwas übertrieben, wenn wir wissen, dass höchstens zwei Treffer mit der jeweils anderen Alternative möglich sind. Auch diese Lösung ist ziemlich langsam, etwa viermal langsamer als die einfache.

Die Geschwindigkeit dieser Methoden ist oft von der Art der Daten abhängig. In seltenen Fällen, bei sehr langen Strings mit wenig Whitespace an beiden Enden, kann die zweitletzte Methode etwas schneller sein als die einfache. In meinen Programmen benutze ich dennoch

s/^\s+//;
s/\s+$//;

oder eine äquivalente Formulierung in der benutzten Programmiersprache, weil es fast immer schneller ist und weil es zweifellos die Absicht viel klarer ausdrückt.

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema Reguläre Ausdrücke bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:
   

Copyright der deutschen Ausgabe © 2008 by O’Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "Reguläre Ausdrücke" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstr. 81, 50670 Köln