webentwicklung-frage-antwort-db.com.de

Wie erfasst man eine beliebige Anzahl von Gruppen in JavaScript Regexp?

Ich würde diese Zeile von JavaScript erwarten:

"foo bar baz".match(/^(\s*\w+)+$/)

um etwas zurückzugeben wie:

["foo bar baz", "foo", " bar", " baz"]

stattdessen wird nur das zuletzt erfasste Match zurückgegeben:

["foo bar baz", " baz"]

Gibt es eine Möglichkeit, alle erfassten Übereinstimmungen zu erhalten?

75
disc0dancer

Wenn Sie eine Erfassungsgruppe in den meisten Varianten wiederholen, wird nur die letzte Erfassung beibehalten. Alle vorherigen Aufnahmen werden überschrieben. In einigen Geschmacksrichtungen, z.B. .NET, Sie können alle Zwischenerfassungen abrufen, aber dies ist bei Javascript nicht der Fall.

Das heißt, wenn Sie in Javascript ein Muster mit [~ # ~] n [~ # ~] Erfassungsgruppen haben, können Sie nur genau [~ # ~] n [~ # ~] Zeichenfolgen pro Match, auch wenn einige dieser Gruppen wiederholt wurden.

Im Allgemeinen also, je nachdem, was Sie tun müssen:

  • Wenn es eine Option ist, teilen Sie es stattdessen auf Trennzeichen auf
  • Anstatt /(pattern)+/ zuzuordnen, kann /pattern/g, vielleicht in einer exec Schleife
    • Beachten Sie, dass diese beiden nicht genau gleichwertig sind, es jedoch eine Option sein kann
  • Mehrebenenabgleich durchführen:
    • Erfasse die wiederholte Gruppe in einem Spiel
    • Führen Sie dann einen weiteren regulären Ausdruck aus, um das Match zu trennen

Verweise


Beispiel

Hier ist ein Beispiel für die Zuordnung von <some;words;here> in einem Text mit einer exec -Schleife und anschließender Aufteilung auf ; um einzelne Wörter zu erhalten ( siehe auch auf ideone.com ):

var text = "a;b;<c;d;e;f>;g;h;i;<no no no>;j;k;<xx;yy;zz>";

var r = /<(\w+(;\w+)*)>/g;

var match;
while ((match = r.exec(text)) != null) {
  print(match[1].split(";"));
}
// c,d,e,f
// xx,yy,zz

Das verwendete Muster ist:

      _2__
     /    \
<(\w+(;\w+)*)>
 \__________/
      1

Dies entspricht <Word>, <Word;another>, <Word;another;please> usw. Gruppe 2 wird wiederholt, um eine beliebige Anzahl von Wörtern zu erfassen, kann jedoch nur die letzte Erfassung beibehalten. Die gesamte Wortliste wird von Gruppe 1 erfasst. Diese Zeichenfolge ist dann split auf dem Semikolon-Trennzeichen.

Verwandte Fragen

83

Wie ist das? "foo bar baz".match(/(\w+)+/g)

7
meder omuraliev

Sofern Sie keine komplizierteren Anforderungen für die Aufteilung Ihrer Zeichenfolgen haben, können Sie diese aufteilen und dann die ursprüngliche Zeichenfolge mit diesen zurückgeben:

var data = "foo bar baz";
var pieces = data.split(' ');
pieces.unshift(data);
5
g.d.d.c

versuche es mit 'g':

"foo bar baz".match(/\w+/g)
4
Jet