it-swarm.com.de

Wie erklärt man "1 $" in Javascript, wenn man reguläre Ausdrücke verwendet?

Ein Stück Javascript-Code lautet wie folgt:

    num="11222333";
    re = /(\d+)(\d{3})/;
    re.test(num);
    num.replace(re, "$1,$2");

Ich konnte die Grammatik von "$ 1, $ 2" nicht verstehen. Das Buch, aus dem dieser Code stammt, besagt, dass $ 1 RegEx bedeutet. $ 1, $ 2 bedeutet RegExp $ 2. Diese Erklärungen führen jedoch zu weiteren Fragen:

  1. Es ist bekannt, dass in Javascript der Name der Variablen mit dem Buchstaben oder _ beginnen sollte. Wie kann $ 1 ein gültiger Name der Member-Variablen von RegExp sein?

  2. Wenn ich $ 1 eingebe, wird in der Befehlszeile angegeben, dass es nicht definiert ist. Wenn ich "$ 1" eingebe, gibt die Befehlszeile nur $ 1 und nicht 11222 wieder. Wie weiß die Ersetzungsmethode, was "$ 1, $ 2" bedeutet?

Vielen Dank.

14
user2384994

Es ist keine "Variable" - es ist ein Platzhalter, der im Aufruf von .replace() verwendet wird. $n steht für die nth-Capture-Gruppe des regulären Ausdrucks.

num="11222333";

// This regex captures the last 3 digits as capture group #2
// and all preceding digits as capture group #1
re = /(\d+)(\d{3})/;

re.test(num);

// This replace call replaces the match of the regex (which happens
// to match everything) with the first capture group ($1) followed by
// a comma, followed by the second capture group ($2)
num.replace(re, "$1,$2");
26
voithos

Sie interpretieren diese Codezeile falsch. Sie sollten den String "$1,$2" betrachten, einen Formatbezeichner , der intern von der replace-Funktion verwendet wird, um zu wissen, was zu tun ist. Es verwendet den zuvor getesteten regulären Ausdruck, der 2 Ergebnisse (zwei in Klammern stehende Blöcke) ergab, und formatiert die Ergebnisse neu. $1 bezieht sich auf die erste Übereinstimmung, $2 auf die zweite. Der erwartete Inhalt der num-Zeichenfolge ist somit 11222,333 nach diesem Code-Bit.

3

Es ist bekannt, dass in Javascript der Name der Variablen mit dem Buchstaben oder _ beginnen sollte.

Nein, ist es nicht. $1 ist eine perfekt gültige Variable. Sie müssen es jedoch zuerst zuweisen:

$variable = "this is a test"

So verwenden jQuery-Benutzer eine Variable mit dem Namen $ als Alias ​​für das Objekt jQuery.

2
meagar

$ 1 ist die erste Gruppe Ihres regulären Ausdrucks, $ 2 ist die zweite. Gruppen werden in Klammern definiert, sodass Ihre erste Gruppe ($ 1) mit (\ d +) übereinstimmt. Sie müssen einige reguläre Ausdrücke nachlesen, um zu verstehen, was mit dem übereinstimmt.

Es ist bekannt, dass in Javascript der Name der Variablen mit dem Buchstaben oder _ beginnen sollte. Wie kann $ 1 ein gültiger Name der Member-Variablen von RegExp sein? 

Das stimmt nicht. $ ist ein gültiger Variablenname wie $ 1. Sie können dies einfach herausfinden, indem Sie es ausprobieren. Siehe jQuery und zahlreiche andere Frameworks.

2
Mark Chorley

In dem Buch, aus dem dieser Code stammt, steht $ 1 für RegExp. $ 1, $ 2 für RegExp. $ 2.

Dieses Buch besteht aus Papier. Und Papier kann sich keinem Widerstand widersetzen, auf den geschrieben wird : -). Aber vielleicht haben Sie nur das falsch interpretiert, was in diesem Buch geschrieben steht.

Eigentlich kommt es auf den Kontext an.

  1. Im Kontext der replace() method von String, $1, $2, ... $99 (1 bis 99) sind - Platzhalter . Sie werden intern von der replace() method behandelt (und haben nichts mit RegExp.$1 Zu tun. RegExp.$2 Usw., die wahrscheinlich nicht einmal definiert sind (siehe Punkt 2. )). Siehe String.prototype.replace () #Specifying_a_string_as_a_parameter . Vergleichen Sie dies mit dem Rückgabewert der match() Methode von String , wenn der flagg wird nicht verwendet, ähnlich dem Rückgabewert des exec() = Methode von RegExp . Vergleichen Sie auch mit die übergebenen Argumente implizit mit einer (optionalen) Funktion, die als zweites Argument von replace() angegeben wurde.
  2. RegExp.$1, RegExp.$2, ... RegExp.$9 (Nur 1 bis 9) sind nicht standardmäßige Eigenschaften von RegExp, wie Sie unter RegExp. $ 1- $ 9 und Veraltete und veraltete Funktionen sehen können. Sie scheinen in Ihrem Browser implementiert zu sein, aber für andere können sie nicht definiert werden . Um sie zu verwenden, müssen Sie immer $1, $2 Usw. mit RegExp. Voranstellen. Diese Eigenschaften sind statisch, schreibgeschützt und werden im RegExp globalen Objekt gespeichert, nicht in einem einzelnen regulären Ausdrucksobjekt. Aber auf jeden Fall Sie sollten sie nicht verwenden. Die von der replace() method von String intern verwendeten $1 Bis $99 Werden gespeichert anderswo .

Einen schönen Tag noch!

1
pascallothar