2010-11-06 19 views
9

Ich habe anscheinend widersprüchliche Ratschläge in den Büchern, die ich über diese Funktionalität gelesen habe. Ich frage mich, ob jemand klären könnte. Zum Beispiel Nicholas Zakas die Funktion Argument besagt, hat eine Signatur des Formats Funktion (Spiel, pos, Originaltext) (P139: Pro JavaScript für Web-Entwickler 2nd ed: Wrox)JavaScript String Ersetzen mit regulärem Ausdruck und Funktion als Argumente

Er auf, wenn Sie den regulären Ausdruck zu sagen, geht Hat eine Übereinstimmung, wird die Funktion drei Argumente übergeben (wie oben). Wenn mehrere Capture-Gruppen vorhanden sind, wird jede übereinstimmende Zeichenfolge als Argument übergeben, wobei die letzten beiden Positionen die Position und OriginalText sind.

Dann kommen wir zu Doug Crockfords, JavaScript: The Good Parts. (P90): Er schreibt die Syntax erneut als string (searchValue, replaceValue) searchValue kann eine Regex sein - eine große Übereinstimmung .. Wenn replaceValue eine Funktion ist, ist der erste Parameter der übereinstimmende Text, dann ist zweite Capture-Gruppe 1 , die dritte ist Capture-Gruppe 2 und so weiter .. Es gibt einen spürbaren Unterschied hier. (also kein Positionsargument)

Ich habe mir auch ein Beispiel in Pro JavaScript Design Patterns (APress P152) angeschaut, das den gesamten Cross-Referencing-Prozess ausschaltete. Diese Typen (Ross Harmes/Dustin Diaz) geben die Funktion replaceValue mit zwei Argumenten, die & b heißen, nicht hilfreich an. Aber es neigt dazu, die von Doug Crockford beschriebene Vorstellung zu verstärken.

Kann jemand bestätigen, ob die Beschreibung von Nicholas Zakas tatsächlich eine gültige Option ist?

Antwort

8

Zakas ist korrekt, die vorletzten und letzten Argumente sind pos und originalText. Aus den ECMA-262 3rd5th und Ausgaben (Abschnitt 15.5.4.11):

Wenn replaceValue eine Funktion ist, dann für jedes Teilzeichen abgestimmt, rufen die Funktion mit den folgenden m + 3 Argumenten. Argument 1 ist die übereinstimmende Teilzeichenfolge. Wenn searchValue ein regulärer Ausdruck ist, sind die nächsten m Argumente alle Erfassungen im MatchResult (siehe 15.10.2.1). Argument m + 2 ist der Versatz innerhalb der Zeichenkette, in dem die Übereinstimmung aufgetreten ist, und das Argument m + 3 ist string.

Beachten Sie, dass String.prototype.replace war neu in ECMA-262 3. Ausgabe. Die MSDN-Dokumentation für die JScript- und MDC-Dokumentation für JavaScript entspricht dieser Spezifikation.

+0

Danke für Links und. Die Moziliola im Besonderen war großartig. – JGFMK

4

Die ECMAScript-Spezifikation hat:

String.prototype.replace (searchValue, replaceValue) 

Wenn search ein regulärer Ausdruck ist (ein Objekt, dessen [[Klasse]] Eigenschaft ist „RegExp "), mache folgendes: Wenn searchValue. global ist false, dann Suchzeichenfolge für die erste Übereinstimmung des regulären Ausdrucks searchValue. Wenn searchValue.global ist true, dann Suchzeichenfolge für alle Übereinstimmungen des regulären Ausdrucks searchValue. Führen Sie die Suche auf die gleiche Weise aus wie in String.prototype.match, einschließlich der Aktualisierung von searchValue. letzterIndex. Sei m die Anzahl der linken einfangenden Klammern in searchValue (NCapturingParens wie in 15.10.2.1 angegeben).

Wenn searchValue kein regulärer Ausdruck ist, lese searchString ToString (searchValue) und suche nach dem ersten Vorkommen von searchString. Sei m gleich 0.

Wenn replaceValue eine Funktion ist, dann rufen Sie die Funktion für jede übereinstimmende Teilzeichenfolge mit den folgenden m + 3 Argumenten auf. Argument 1 ist die übereinstimmende Teilzeichenfolge. Wenn searchValue ein regulärer Ausdruck ist, sind die nächsten m Argumente alle Captures in MatchResult (siehe 15.10.2.1). Das Argument m + 2 ist der Versatz innerhalb der Zeichenkette, in dem die Übereinstimmung aufgetreten ist, und das Argument m + 3 ist eine Zeichenkette. Das Ergebnis ist ein Zeichenfolgenwert, der von der ursprünglichen Eingabe abgeleitet wird, indem jede übereinstimmende Teilzeichenfolge durch den entsprechenden Rückgabewert des Funktionsaufrufs ersetzt wird, der bei Bedarf in eine Zeichenfolge konvertiert wird.

Es ist ein bisschen verwirrend, aber ich denke, Zakas hat Recht.

+0

Danke für die Antwort. Hast du einen Link zur Spezifikation? – JGFMK

+0

http://bclary.com/2004/11/07/ für Rev 3 html. offizielle Seite ist http://www.ecmascript.org/docs.php –

+0

Cheers für Link – JGFMK

Verwandte Themen