template

Index :: Javascript :: Reguläre Ausdrücke

Wie bei UNIX und PERL existieren auch in Javascript diverse Möglichkeiten, mittels Regulärer Ausdrücke auf Strings zuzugreifen, um z.B. Zeichenfolgen zu suchen, zu extrahieren oder zu ersetzen.
Zur internen Syntax siehe auch: Anhang :: Reguläre Ausdrücke

RegExp :: Literale Notation

Bei der literalen Notation wird der Ausdruck in Schrägstrichen (Slashes) eingeschlossen, um ihn entweder einer Variablen zuzuweisen oder ihn direkt zu benutzen.
Hier wird in einem Text nach der Sequenz abc gesucht:
Variable
var r = /abc/; var i = text.search(r);
direkt
var i = text.search(/abc/);
Eventuelle Modifizierer werden hinter den schließenden Schrägstrich gesetzt:
var r = /abc/gi;
Hier werden alle Ziffern durch ein Kanalgitter (#) ersetzt:
text = text.replace(/\d/g, '#');

RegExp :: Konstruktor

Mithilfe des RegExp-Konstruktors können Ausdrücke dynamisch erzeugt werden.
Dies ist vor allem innerhalb von Schleifen/Funktionen nützlich, oder allgemein in Situationen, in denen der Ausdruck zur Erstellungszeit nicht bekannt ist.
Auch hier wird in einem Text nach der Sequenz abc gesucht:
var r = new RegExp('abc');
var i = text.search(r);
Eventuelle Modifizierer können in einem optionalen zweiten Parameter übergeben werden:
var r = new RegExp('abc', 'i');
Hier werden alle Ziffern durch ein Kanalgitter (#) ersetzt:
var r = new RegExp('\\d', 'g');
text = text.replace(r, '#');

RegExp :: Eigenschaften

EigenschaftBeschreibung
Betrifft nur das globale RegExp-Objekt
$1...$9Speicherung von bis zu 9 Textteilen, die beim letzten Ausdruck mittels geklammerter Ausdrücke definiert wurden.
Hier wird im Nachhinein das gefundene Wort ('Max') ausgegeben:
/(\w+)/.test('Max und Moritz'); alert(RegExp.$1);
lastMatchLiefert die zuletzt gefundene Zeichenfolge
leftContextZeichenfolge vor dem letzten Treffer, hier 'www.':
/goo/.test('www.google.com'); alert(RegExp.leftContext);
rightContextZeichenfolge nach dem letzten Treffer, hier 'gle.com':
/goo/.test('www.google.com'); alert(RegExp.rightContext);
lastParenLetzter Textteil aufgrund geklammerten Ausdrucks, falls vorhanden, hier 'goo':
/(goo)/.test('www.google.com'); alert(RegExp.lastParen);
Betrifft nur RegExp-Instanzen
sourceEnthält eine Kopie des zuletzt angewendeten Regulären Ausdrucks.
Hier wird der Ausdruck ('\w+') noch einmal ausgegeben:
var r=/\w+/; alert(r.source);
globalBool'scher Wert: letzter Ausdruck besitzt das g-Flag.
ignoreCaseBool'scher Wert: letzter Ausdruck besitzt das i-Flag.
multilineBool'scher Wert: letzter Ausdruck besitzt das m-Flag.
lastIndexEnthält den Index des Zeichens hinter dem letzten Treffer, bzw. 0, falls nichts gefunden wurde.
Hier wird die Position des Blanks hinter 'und' geliefert, also 7:
var r=/und/g; r.exec('Max und Moritz'); alert(r.lastIndex);
Diese Eigenschaft wird nur gesetzt, wenn der Ausdruck das g-Flag besitzt.

RegExp :: Methoden

MethodeBeschreibung
compile()Ändert den Ausdruck zur Laufzeit und liefert dessen literale Form.
var r = new RegExp();
r.compile('abc');
Eventuelle Modifizierer können in einem optionalen zweiten Parameter übergeben werden.
Hier wird z.B. '/abc/g' angezeigt:
alert(r.compile('abc', 'g'));
exec()Führt eine Treffersuche durch und liefert den gefundenen Textteil. Falls keine Treffer vorhanden sind, wird null geliefert.
Hier wird die erste Ziffernfolge ('1998') extrahiert:
alert(/\d+/.exec('Im Jahre 1998 gab es 281 Sonnentage.'));
Die Trefferposition (9) wird angezeigt:
alert(/\d+/.exec('Im Jahre 1998 gab es 281 Sonnentage.').index);
Anzeige des Textes, auf den der Ausdruck angewendet wird:
alert(/\d+/.exec('Im Jahre 1998 gab es 281 Sonnentage.').input);
Es wird immer nur bis zum ersten Treffer gesucht, d.h. der Schalter g ist bei exec() obsolet.

Werden Klammerungen verwendet, dann liefert die Funktion bei Erfolg ein Array, wobei Element[0] den gefundenen Textteil enthält, während die Elemente[1...N] (analog $1...$9) die mittels geklammerter Ausdrücke gefundenen Textteile enthalten.

Nachfolgend wird die Syntax eines Datumstextes geprüft; der Ausdruck gibt das Format vor:
- 1 oder 2 Ziffern (für Tag)
- ein beliebiges Trennzeichen
- 1 oder 2 Ziffern (für Monat)
- das selbe Trennzeichen
- 4 Ziffern (für Jahr)
Ausserdem wird im Erfolgsfall aufgrund der Klammerungen ein Array geliefert:
Element[0]: das komplette Datum
Element[1]: Tag
Element[2]: Trennzeichen
Element[3]: Monat
Element[4]: Jahr
Anschließend werden die Datumselemente grob auf Bereichsüberschreitung geprüft:
var a = /(\d{1,2})(.)(\d{1,2})\2(\d{4})/.exec('Es geschah am 13-7-1998.');
alert(a && a[1]>0 && a[1]<32 && a[3]>0 && a[3]<13 && a[4]>1970 && a[4]<2100);
test()Prüft auf existierendes Muster und liefert Bool'schen Wert zurück.
Im Beispiel wird geprüft, ob ein Mozilla-Browser verwendet wird:
alert(/moz/i.test(navigator.appCodeName));
Es wird immer nur bis zum ersten Treffer gesucht, d.h. der Schalter g ist bei test() obsolet.

String-Methoden :: match()

Führt eine Treffersuche durch und liefert die Ergebnisse als Array. Falls keine Treffer vorhanden sind, wird null geliefert.
Das nachfolgende Beispiel versorgt arr mit dem Array [17, 5, 1977, 3]:
var txt = 'Geboren am 17.5.1977, Zugriffe: 3';
var arr = txt.match(/\d+/g);
Durch match() werden auch die Eigenschaften $1...$9 des RegExp-Objekts geupdatet.

String-Methoden :: replace()

Sucht und ersetzt Textteile, auf die der Ausdruck passt. Wird häufig benutzt, um überflüssige Zeichen zu entfernen.
Im Beispiel werden aus einer Telefonnummer alle runden Klammern und Bindestriche entfernt:
var nr = '(0621)123-4567';
nr = nr.replace(/[\(\)-]/g, '');
Weil runde Klammern Metazeichen sind, mussten sie hier per Escapezeichen (Backslash) entschärft werden.

Da durch replace() auch die Eigenschaften $1...$9 des RegExp-Objekts geupdatet werden, kann direkt auf gefundene Textteile zugegriffen werden.
Hier werden z.B. Vorname und Nachname vertauscht; der String name enthält anschließend 'Meier, Alfons':
var name = 'Alfons Meier';
name = name.replace(/(\w+)\s(\w+)/, '$2, $1');
Statt eines Ersatz-Strings kann auch eine Funktion angegeben werden.
Im Beispiel wird eine Inlinefunktion verwendet, um alle spitzen Klammern eines Textes durch deren HTML-Entities zu ersetzen. Dies ist z.B. nützlich, um Skript-Intrusions von Benutzereingaben zu verhindern:
var txt = '<b>hallo</b>';
txt = txt.replace(/<|>/g, function(s){return s=='<'?'&lt;':'&gt;'});

String-Methoden :: search()

Testet auf einen Treffer im String. Zurückgeliefert wird der Zeichenindex des (ersten) Treffers, bzw. -1, falls nichts gefunden wurde.
Im Beispiel wird zuerst -1 und dann 3 angezeigt:
alert('abcde'.search(/def/));
alert('abcdefgh'.search(/def/));
Es wird immer nur bis zum ersten Treffer gesucht, d.h. der Schalter g ist bei search() obsolet.

String-Methoden :: split()

Zerteilt einen String anhand eines Trennzeichens (bzw. einer Trennsequenz) und liefert die Textteile als Array.
Das Beispiel extrahiert Komma-separierte Elemente (wobei irrelevante Whitespaces ignoriert werden) und versorgt arr mit dem Array ['a', 'b', 'c', 'd', 'e']:
var txt = 'a,b, c,  d,   e';
var arr = txt.split(/\s*,\s*/);
Es wird immer global gesucht, d.h. der Schalter g ist bei split() obsolet.

Index :: Javascript


template