2009-05-01 8 views
19

Seit ich begann, diese Frage zu schreiben, denke ich, dass ich die Antworten auf jede Frage, die ich hatte, aber ich dachte, ich würde trotzdem posten, wie es für andere nützlich sein könnte und mehr Klärung könnte sei hilfreich.Javascript wird nicht mit Regex teilen

Ich habe versucht, einen regulären Ausdruck mit Lookahead mit der Javascript-Funktion zu verwenden. Aus irgendeinem Grund wurde die Zeichenfolge nicht geteilt, obwohl sie eine Übereinstimmung findet, wenn ich die Übereinstimmung anrufe. Ich dachte ursprünglich, das Problem liege in der Verwendung von Lookahead in meinem regulären Ausdruck. Hier ist ein vereinfachtes Beispiel:

funktioniert nicht:

"aaaaBaaaa".split("(?=B)."); 

Works:

"aaaaBaaaa".match("(?=B)."); 

Es scheint das Problem war, dass in dem geteilten Beispiel die übergebene Zeichenfolge nicht interpretiert wurde als regulärer Ausdruck. Die Verwendung von Schrägstrichen anstelle von Anführungszeichen scheint das Problem zu beheben.

"aaaaBaaaa".split(/(?=B)./); 

bestätigte ich meine Theorie mit der folgenden dumme schau Beispiel:

"aaaaaaaa(?=B).aaaaaaa".split("(?=B)."); 

Hat jemand denken, dass es seltsam ist, dass die Match-Funktion voraus, dass Sie einen regulären Ausdruck, während die Split-Funktion nicht der Fall ist?

+0

Ich habe immer die/regex/(no quotes) -Syntax für alles verwendet: match, split, replace. Ich habe nicht bemerkt, dass du in einigen Fällen nicht musst. –

+2

Eigentlich ist es sinnvoll, dass match() eine Regex (was * sonst * würde da passen?) Und split() eine Zeichenkette annehmen, da das Teilen auf einer Zeichenkette wahrscheinlich schneller ist als das Teilen auf einer Regex.Nur wenn Sie eine tatsächliche Regex an split() übergeben, wird das langsamere Regex-Splitting ausgeführt. – Tomalak

Antwort

31

String.split akzeptiert entweder einen String oder einen regulären Ausdruck als ersten Parameter. Die String.match Methode akzeptiert nur einen regulären Ausdruck.

Ich würde mir vorstellen, dass String.match wird versuchen und mit was auch immer bestanden wird arbeiten; Wenn Sie also eine Zeichenfolge übergeben, wird sie als regulärer Ausdruck interpretiert. Die String.split Methode hat nicht den Luxus, dies zu tun, weil sie reguläre Ausdrücke UND Zeichenketten akzeptieren kann; in diesem Fall wäre es töricht, zu vermuten.


bearbeiten: (Aus: "JavaScript: The Definitive Guide")

String.match erfordert einen regulären Ausdruck mit zu arbeiten. Das übergebene Argument muss ein RegExp Objekt sein, das das Muster angibt, das angepasst werden soll. Wenn dieses Argument kein RegExp ist, wird es zuerst in eins konvertiert, indem es an den RegExp() Konstruktor übergeben wird.

3

Wenn ich mich richtig erinnere (und ich könnte hier sehr falsch sein), wurde die Split-Methode in Javascript implementiert, bevor die Regex-Engine weit verbreitet war, also ist es vermutlich aus Gründen der Rückwärtskompatibilität.

+1

Ich denke, das hält; String.split wurde in 1.1 und Regular Expressions in 1.2 eingeführt. Lesen Sie die Dokumentation über 'split()' (hier: http://wp.netscape.com/eng/mozilla/3.0/handbook/javascript/newfunc.htm) und die Regex-Erweiterungen zu 'split()' hier: http : //web.archive.org/web/20010408055419/developer.netscape.com/docs/manuals/communicator/jsguide/js1_2.htm (kein direkter Link, siehe unter 'Reguläre Ausdrücke' -> 'String-Methoden' – Steen