Ich versuche, URL-codierte Zeichenfolgen zu analysieren, die aus Schlüssel / Wert-Paaren bestehen, die durch entweder &
oder getrennt sind &
.
Das Folgende stimmt nur mit dem ersten Vorkommen überein, wobei die Schlüssel und Werte in separate Ergebniselemente aufgeteilt werden:
var result = mystring.match(/(?:&|&)?([^=]+)=([^&]+)/)
Die Ergebnisse für die Zeichenfolge '1111342 = Adam% 20Franco & 348572 = Bob% 20Jones' wären:
['1111342', 'Adam%20Franco']
Die Verwendung des globalen Flags 'g' stimmt mit allen Vorkommen überein, gibt jedoch nur die vollständig übereinstimmenden Teilzeichenfolgen zurück, nicht die getrennten Schlüssel und Werte:
var result = mystring.match(/(?:&|&)?([^=]+)=([^&]+)/g)
Die Ergebnisse für die Zeichenfolge '1111342 = Adam% 20Franco & 348572 = Bob% 20Jones' wären:
['1111342=Adam%20Franco', '&348572=Bob%20Jones']
Obwohl ich die Zeichenfolge aufteilen &
und jedes Schlüssel / Wert-Paar einzeln aufteilen könnte , gibt es eine Möglichkeit, die Unterstützung für reguläre Ausdrücke von JavaScript zu verwenden, um mehrere Vorkommen des Musters /(?:&|&)?([^=]+)=([^&]+)/
abzugleichen, die der PHP- preg_match_all()
Funktion ähneln ?
Ich strebe nach einer Möglichkeit, Ergebnisse zu erzielen, wenn die Teilspiele wie folgt getrennt sind:
[['1111342', '348572'], ['Adam%20Franco', 'Bob%20Jones']]
oder
[['1111342', 'Adam%20Franco'], ['348572', 'Bob%20Jones']]
quelle
replace
hier empfohlen hat.var data = {}; mystring.replace(/(?:&|&)?([^=]+)=([^&]+)/g, function(a,b,c,d) { data[c] = d; });
getan. "matchAll" in JavaScript ist "Ersetzen" durch eine Ersetzungshandlerfunktion anstelle einer Zeichenfolge.Antworten:
Aus den Kommentaren gehisst
Die Browserunterstützung finden Sie hier https://caniuse.com/#feat=urlsearchparams
Ich würde einen alternativen regulären Ausdruck vorschlagen, bei dem Untergruppen verwendet werden, um den Namen und den Wert der Parameter einzeln und zu erfassen
re.exec()
:result
ist ein Objekt:Die Regex gliedert sich wie folgt:
quelle
x = y
zuweisen würdey
zux
und produzieren auchy
). Wenn wir dieses Wissen anwenden aufif (match = re.exec(url))
: Dieses A) erledigt die Aufgabe und B) gibt das Ergebnis vonre.exec(url)
an das zurückwhile
. Gibt jetztre.exec
zurück,null
wenn keine Übereinstimmung vorliegt. Dies ist ein falscher Wert. Tatsächlich wird die Schleife so lange fortgesetzt, wie eine Übereinstimmung vorliegt.Sie müssen den Schalter 'g' für eine globale Suche verwenden
quelle
2020 bearbeiten
Verwenden Sie URLSearchParams , da für diesen Job kein benutzerdefinierter Code mehr erforderlich ist. Browser können dies mit einem einzigen Konstruktor für Sie tun:
ergibt
Es gibt also keinen Grund mehr, dafür Regex zu verwenden.
Ursprüngliche Antwort
Wenn Sie sich nicht auf das "Blind Matching" verlassen möchten, das mit dem Running
exec
Style Matching einhergeht, verfügt JavaScript über eine integrierte Match-All-Funktionalität, die jedoch Teil desreplace
Funktionsaufrufs ist, wenn Sie ein "Was tun mit der Erfassung?" Verwenden Gruppen " Handhabungsfunktion :getan.
Anstatt die Funktion zum Behandeln von Erfassungsgruppen zu verwenden, um tatsächlich Ersatzzeichenfolgen zurückzugeben (für das Ersetzen von Ersetzungen ist das erste Argument die vollständige Musterübereinstimmung, und nachfolgende Argumente sind einzelne Erfassungsgruppen), nehmen wir einfach die Erfassungen der Gruppen 2 und 3 und zwischenspeichern dieses Paar.
Denken Sie also daran, dass die Funktion "matchAll" in JavaScript nicht durch komplizierte Parsing-Funktionen geschrieben wird, sondern einfach durch eine Ersatz-Handler-Funktion "ersetzt" wird und dass eine hohe Effizienz beim Mustervergleich erzielt werden kann.
quelle
something "this one" and "that one"
. Ich möchte alle Zeichenfolgen in doppelten Anführungszeichen in eine Liste einfügen, dh [diese, diese]. Bishermystring.match(/"(.*?)"/)
funktioniert es gut, die erste zu erkennen, aber ich weiß nicht, wie ich Ihre Lösung für eine einzelne Erfassungsgruppe anpassen soll.Zum Erfassen von Gruppen bin ich es gewohnt,
preg_match_all
in PHP zu arbeiten, und ich habe versucht, die Funktionalität hier zu replizieren:quelle
/g
andernfallsexec()
wird der aktuelle Index nicht geändert und für immer wiederholt.Legen Sie den
g
Modifikator für eine globale Übereinstimmung fest:quelle
Quelle:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec
Aufeinanderfolgende Übereinstimmungen finden
Wenn Ihr regulärer Ausdruck das Flag "g" verwendet, können Sie die Methode exec () mehrmals verwenden, um aufeinanderfolgende Übereinstimmungen in derselben Zeichenfolge zu finden. Wenn Sie dies tun, beginnt die Suche mit der Teilzeichenfolge von str, die durch die lastIndex-Eigenschaft des regulären Ausdrucks angegeben wird (test () erweitert auch die lastIndex-Eigenschaft). Angenommen, Sie haben dieses Skript:
Dieses Skript zeigt den folgenden Text an:
Hinweis: Platzieren Sie das Literal für reguläre Ausdrücke (oder den RegExp-Konstruktor) nicht in der while-Bedingung, da sonst eine Endlosschleife erstellt wird, wenn eine Übereinstimmung vorliegt, da die lastIndex-Eigenschaft bei jeder Iteration zurückgesetzt wird. Stellen Sie außerdem sicher, dass das globale Flag gesetzt ist, da sonst auch hier eine Schleife auftritt.
quelle
String.prototype.match
mit derg
Flagge:'abbcdefabh'.match(/ab*/g)
Rückkehr['abb', 'ab']
Wenn jemand (wie ich) Tomalaks Methode mit Array-Unterstützung benötigt (dh Mehrfachauswahl), ist dies hier:
Eingang
?my=1&my=2&my=things
Ergebnis
1,2,things
(früher nur zurückgegeben: Dinge)quelle
Um bei der vorgeschlagenen Frage zu bleiben, wie im Titel angegeben, können Sie tatsächlich jede Übereinstimmung in einer Zeichenfolge mit iterieren
String.prototype.replace()
. Das Folgende bewirkt beispielsweise genau das, um ein Array aller Wörter basierend auf einem regulären Ausdruck zu erhalten:Wenn ich Erfassungsgruppen oder sogar den Index jedes Spiels erhalten wollte, könnte ich das auch tun. Das Folgende zeigt, wie jede Übereinstimmung mit der gesamten Übereinstimmung, der 1. Erfassungsgruppe und dem Index zurückgegeben wird:
Nach dem Ausführen des oben genannten
words
wird wie folgt sein:Um mehrere Vorkommen, die denen in PHP ähneln, zuzuordnen
preg_match_all
, können Sie diese Art des Denkens verwenden, um Ihre eigenen zu erstellen oder so etwas zu verwendenYourJS.matchAll()
. YourJS definiert diese Funktion mehr oder weniger wie folgt:quelle
YourJS.parseQS()
( yourjs.com/snippets/56 ), obwohl viele andere Bibliotheken diese Funktionalität ebenfalls anbieten.Wenn Sie damit durchkommen können,
map
ist dies eine vierzeilige Lösung:Ist nicht schön, nicht effizient, aber zumindest kompakt. ;)
quelle
Verwendung
window.URL
:quelle
Hallo von 2020. Lassen Sie mich auf String.prototype.matchAll () aufmerksam machen:
Ausgänge:
quelle
Um mehrere Parameter mit demselben Namen zu erfassen, habe ich die while-Schleife in Tomalaks Methode wie folgt geändert:
Eingang:
?firstname=george&lastname=bush&firstname=bill&lastname=clinton
kehrt zurück:
{firstname : ["george", "bill"], lastname : ["bush", "clinton"]}
quelle
?cinema=1234&film=12&film=34
ich es erwarten würde{cinema: 1234, film: [12, 34]}
. Ihre Antwort wurde bearbeitet, um dies widerzuspiegeln.Nun ... ich hatte ein ähnliches Problem ... Ich möchte eine inkrementelle / schrittweise Suche mit RegExp (z. B. Suche starten ... etwas verarbeiten ... Suche bis zur letzten Übereinstimmung fortsetzen)
Nach vielen Internet-Suchen ... wie immer (das wird jetzt zur Gewohnheit) lande ich in StackOverflow und habe die Antwort gefunden ...
Was nicht erwähnt wird und zu erwähnen ist, ist "
lastIndex
". Ich verstehe jetzt, warum das RegExp-Objekt dielastIndex
Eigenschaft " " implementiertquelle
Das Aufteilen scheint mir die beste Option zu sein:
quelle
Um die Regex-Hölle zu vermeiden, könnten Sie Ihre erste Übereinstimmung finden, einen Teil abhacken und dann versuchen, die nächste auf dem Teilstring zu finden. In C # sieht das ungefähr so aus. Entschuldigung, ich habe es nicht für Sie auf JavaScript portiert.
quelle