165 Stimmen

Wie kann ich mehrere Vorkommen mit einer Regex in JavaScript abgleichen, ähnlich wie bei PHP's preg_match_all()?

Ich versuche, url-codierte Zeichenfolgen zu analysieren, die aus Schlüssel=Wert-Paaren bestehen, die entweder durch & o & .

Im Folgenden wird nur das erste Vorkommen abgeglichen, 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']

Mit dem globalen Flag 'g' werden alle Vorkommen abgeglichen, aber nur die vollständig übereinstimmenden Teilstrings zurückgegeben, 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']

Während ich die Zeichenkette aufteilen könnte & und jedes Schlüssel/Wert-Paar einzeln aufschlüsseln, gibt es eine Möglichkeit, mit der JavaScript-Unterstützung für reguläre Ausdrücke auf mehrere Vorkommen des Musters /(?:&|&)?([^=]+)=([^&]+)/ ähnlich wie PHPs preg_match_all() Funktion?

Ich suche nach einer Möglichkeit, Ergebnisse zu erhalten, bei denen die Unterübereinstimmungen getrennt sind:

[['1111342', '348572'], ['Adam%20Franco', 'Bob%20Jones']]

o

[['1111342', 'Adam%20Franco'], ['348572', 'Bob%20Jones']]

9 Stimmen

Es ist ein wenig seltsam, dass niemand die Verwendung von replace hier. var data = {}; mystring.replace(/(?:&|&)?([^=]+)=([^&]+)/g, function(a,b,c,d) { data[c] = d; }); erledigt. "matchAll" in JavaScript ist "replace" mit einer Ersetzungsfunktion anstelle einer Zeichenkette.

0 Stimmen

Für diejenigen, die diese Frage im Jahr 2020 immer noch nicht beantworten können, lautet die Antwort: "Don't use regex, use URLSearchParams die all dies für Sie erledigt."

1voto

jnnnnn Punkte 3390

Utilice window.URL :

> s = 'http://www.example.com/index.html?1111342=Adam%20Franco&348572=Bob%20Jones'
> u = new URL(s)
> Array.from(u.searchParams.entries())
[["1111342", "Adam Franco"], ["348572", "Bob Jones"]]

0voto

ZEE Punkte 2477

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 viel Internet-Suche... wie immer (das wird jetzt zur Gewohnheit) landete ich bei StackOverflow und fand die Antwort...

Was nicht erwähnt wird und wichtig ist, ist " lastIndex " Ich verstehe jetzt, warum das RegExp-Objekt die " lastIndex "Eigentum

0voto

ivar Punkte 31

Um mehrere Parameter mit demselben Namen zu erfassen, habe ich die while-Schleife in Tomalaks Methode wie folgt geändert:

  while (match = re.exec(url)) {
    var pName = decode(match[1]);
    var pValue = decode(match[2]);
    params[pName] ? params[pName].push(pValue) : params[pName] = [pValue];
  }

Eingang: ?firstname=george&lastname=bush&firstname=bill&lastname=clinton

zurück: {firstname : ["george", "bill"], lastname : ["bush", "clinton"]}

0 Stimmen

Obwohl mir Ihre Idee gefällt, funktioniert sie nicht gut mit einzelnen Parametern, wie bei ?cinema=1234&film=12&film=34 Ich würde erwarten, dass {cinema: 1234, film: [12, 34]} . Sie haben Ihre Antwort entsprechend geändert.

0voto

pguardiario Punkte 51279

Die Aufteilung scheint mir die beste Option zu sein:

'1111342=Adam%20Franco&348572=Bob%20Jones'.split('&').map(x => x.match(/(?:&|&)?([^=]+)=([^&]+)/))

0voto

andrew pate Punkte 3251

Um die Regex-Hölle zu vermeiden, könnten Sie die erste Übereinstimmung finden, ein Stück abschneiden und dann versuchen, die nächste Übereinstimmung in der Teilzeichenkette zu finden. In C# sieht das in etwa so aus, tut mir leid, dass ich es nicht auf JavaScript für Sie portiert habe.

        long count = 0;
        var remainder = data;
        Match match = null;
        do
        {
            match = _rgx.Match(remainder);
            if (match.Success)
            {
                count++;
                remainder = remainder.Substring(match.Index + 1, remainder.Length - (match.Index+1));
            }
        } while (match.Success);
        return count;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X