Ich versuche, die folgende Art von Zeichenfolge zu analysieren:
[key:"val" key2:"val2"]
wo es beliebige Schlüssel gibt: "val" Paare im Inneren. Ich möchte den Schlüsselnamen und den Wert erfassen. Für diejenigen, die neugierig sind, versuche ich, das Datenbankformat von Task Warrior zu analysieren.
Hier ist meine Testzeichenfolge:
[description:"aoeu" uuid:"123sth"]
Dies soll hervorheben, dass sich alles in einem Schlüssel oder Wert befinden kann, außer Leerzeichen, keine Leerzeichen um die Doppelpunkte und Werte immer in doppelten Anführungszeichen.
Im Knoten ist dies meine Ausgabe:
[deuteronomy][gatlin][~]$ node
> var re = /^\[(?:(.+?):"(.+?)"\s*)+\]$/g
> re.exec('[description:"aoeu" uuid:"123sth"]');
[ '[description:"aoeu" uuid:"123sth"]',
'uuid',
'123sth',
index: 0,
input: '[description:"aoeu" uuid:"123sth"]' ]
Passt aber description:"aoeu"
auch zu diesem Muster. Wie kann ich alle Spiele zurückbekommen?
javascript
regex
regex-group
taskwarrior
Gatlin
quelle
quelle
"some string".match(/regex/g)
Antworten:
Rufen Sie
re.exec(s)
in einer Schleife weiter auf, um alle Übereinstimmungen zu erhalten:Probieren Sie es mit dieser JSFiddle aus: https://jsfiddle.net/7yS2V/
quelle
while
stattdo … while
?while(m = re.exec(s))
, was eine Anti-Pattern-IMO ist, oder Sie müssen schreibenm = re.exec(s); while (m) { ... m = re.exec(s); }
. Ich bevorzuge diedo ... if ... while
Redewendung, aber andere Techniken würden auch funktionieren.g
Flag setzen, sonst wird der interne Zeiger nicht vorwärts bewegt. Docs .str.match(pattern)
Wennpattern
das globale Flag vorhanden istg
, werden alle Übereinstimmungen als Array zurückgegeben.Beispielsweise:
quelle
"All of us except @Emran:emran26, @Raju:raju13 and @Noman:noman42".match(/@(\w+):(\w+)/g)
(die zurückkehren werden["@Emran:emran26", "@Raju:raju13", "@Noman:noman42"]
)/@\w/g
odernew RegExp("@\\w", "g")
Um alle Übereinstimmungen zu durchlaufen, können Sie die folgende
replace
Funktion verwenden:quelle
Dies ist eine Lösung
Dies basiert auf der Antwort von Rasen, aber kürzer.
Beachten Sie, dass das Flag "g" gesetzt sein muss, um den internen Zeiger über Aufrufe nach vorne zu bewegen.
quelle
Gibt alle Übereinstimmungen als Array zurück.
Wenn Sie aus einem mysteriösen Grund die zusätzlichen Informationen benötigen
exec
, die als Alternative zu früheren Antworten enthalten sind, können Sie dies mit einer rekursiven Funktion anstelle einer Schleife wie folgt tun (was auch cooler aussieht).Wie bereits in den Kommentaren erwähnt, ist es wichtig,
g
am Ende der Regex-Definition den Zeiger bei jeder Ausführung nach vorne zu bewegen.quelle
Endlich sehen wir eine eingebaute
matchAll
Funktion. Hier finden Sie die Beschreibung und die Kompatibilitätstabelle . Es sieht so aus, als ob ab Mai 2020 Chrome, Edge, Firefox und Node.js (12+) unterstützt werden, jedoch nicht IE, Safari und Opera. Scheint, als ob es im Dezember 2018 entworfen wurde Geben Sie ihm also etwas Zeit, um alle Browser zu erreichen, aber ich vertraue darauf, dass es dort ankommt.Die eingebaute
matchAll
Funktion ist nett, weil sie eine iterable zurückgibt . Es werden auch Erfassungsgruppen für jedes Spiel zurückgegeben! So können Sie Dinge wie tunEs scheint auch, dass jedes Übereinstimmungsobjekt dasselbe Format wie verwendet
match()
. Also jedes Objekt ist ein Array der Partie und zwischengespeicherten Gruppen zusammen mit drei zusätzlichen Eigenschaftenindex
,input
undgroups
. So sieht es aus:Für weitere Informationen
matchAll
gibt es auch eine Google-Entwicklerseite . Es sind auch Polyfills / Shims erhältlich.quelle
Basierend auf Agus 'Funktion, aber ich bevorzuge es, nur die Übereinstimmungswerte zurückzugeben:
quelle
Iterables sind schöner:
Verwendung in einer Schleife:
Oder wenn Sie ein Array möchten:
quelle
if (m)
sollte seinif (match)
matchAll
, das eineWenn Sie ES9 haben
(Das heißt, wenn Ihr System: Chrome, Node.js, Firefox usw. Ecmascript 2019 oder höher unterstützt)
Verwenden Sie das neue
yourString.matchAll( /your-regex/ )
.Wenn Sie kein ES9 haben
Wenn Sie ein älteres System haben, finden Sie hier eine Funktion zum einfachen Kopieren und Einfügen
Anwendungsbeispiel:
Ausgänge:
quelle
Hier ist meine Funktion, um die Übereinstimmungen zu erhalten:
quelle
Seit ES9 gibt es jetzt eine einfachere und bessere Möglichkeit, alle Übereinstimmungen zusammen mit Informationen zu den Erfassungsgruppen und deren Index abzurufen:
Es wird derzeit in Chrome, Firefox, Opera unterstützt. Je nachdem, wann Sie dies lesen, überprüfen Sie diesen Link , um die aktuelle Unterstützung anzuzeigen.
quelle
g
undlastIndex
vor dem Aufruf von auf 0 zurückgesetzt werden solltematchAll
.Benutze das...
Es wird ein Array aller Übereinstimmungen zurückgegeben ... Das würde gut funktionieren ... Aber denken Sie daran, dass keine Gruppen berücksichtigt werden. Es werden nur die vollständigen Übereinstimmungen zurückgegeben ...
quelle
Ich würde definitiv empfehlen, die Funktion String.match () zu verwenden und eine relevante RegEx dafür zu erstellen. Mein Beispiel ist eine Liste von Zeichenfolgen, die häufig beim Scannen von Benutzereingaben nach Schlüsselwörtern und Phrasen erforderlich ist.
Hoffe das hilft!
quelle
Dies wird bei Ihrem komplexeren Problem nicht wirklich helfen, aber ich poste dies trotzdem, da es eine einfache Lösung für Personen ist, die nicht wie Sie eine globale Suche durchführen.
Ich habe den regulären Ausdruck in der Antwort vereinfacht, um klarer zu sein (dies ist keine Lösung für Ihr genaues Problem).
Das sieht aufgrund der Kommentare ausführlicher aus als es ist. So sieht es ohne Kommentare aus
Beachten Sie, dass alle nicht übereinstimmenden Gruppen im Array als aufgeführt werden
undefined
Werte aufgeführt werden.Diese Lösung verwendet den ES6-Spread-Operator, um das Array von Regex-spezifischen Werten zu bereinigen. Sie müssen Ihren Code über Babel ausführen, wenn Sie IE11-Unterstützung wünschen.
quelle
Hier ist eine einzeilige Lösung ohne while-Schleife .
Die Reihenfolge bleibt in der resultierenden Liste erhalten.
Die möglichen Nachteile sind
quelle
Ich vermute, wenn es Randfälle wie zusätzliche oder fehlende Leerzeichen geben würde, könnte dieser Ausdruck mit weniger Grenzen auch eine Option sein:
Prüfung
RegEx Circuit
jex.im visualisiert reguläre Ausdrücke:
quelle
Hier ist meine Antwort:
quelle
str
) hat das falsche Format (zu viele harte Klammern). Sie erfassen nur den Schlüssel, nicht den Wert. Ihr Code hat einen Syntaxfehler und wird nicht ausgeführt (die letzten Klammern). Wenn Sie eine "alte" Frage mit einer bereits akzeptierten Antwort beantworten, stellen Sie sicher, dass Sie mehr Wissen und eine bessere Antwort als die bereits akzeptierte hinzufügen. Ich glaube nicht, dass Ihre Antwort das tut.