Wie lade ich alle Übereinstimmungen für einen regulären Ausdruck in JavaScript ab?



6 Answers

Um alle Übereinstimmungen zu durchlaufen, können Sie die replace Funktion verwenden:

var re = /\s*([^[:]+):\"([^"]+)"/g;
var s = '[description:"aoeu" uuid:"123sth"]';

s.replace(re, function(match, g1, g2) { console.log(g1, g2); });
javascript regex

Ich bin neu in reguläre Ausdrücke. Ich versuche die folgende Art von String zu parsen:

[key:"val" key2:"val2"]

wo gibt es einen beliebigen Schlüssel: "val" -Paare im Inneren. Ich möchte den Schlüsselnamen und den Wert ergreifen. Für die Neugierigen versuche ich das Datenbankformat von Task Warrior zu parsen. Hier ist meine Testzeichenfolge:

[description:"aoeu" uuid:"123sth"] die hervorheben soll, dass alles außer dem Leerzeichen in einem Schlüssel oder einem Wert sein kann, keine Leerzeichen um die Doppelpunkte und Werte immer in doppelten Anführungszeichen stehen. 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"]' ]

Aber description:"aoeu" auch diesem Muster. Wie kann ich alle Spiele zurückbekommen?




Dies ist eine Lösung

var s = '[description:"aoeu" uuid:"123sth"]';

var re = /\s*([^[:]+):\"([^"]+)"/g;
var m;
while (m = re.exec(s)) {
  console.log(m[1], m[2]);
}

Dies basiert auf der Antwort von linnsea, ist aber kürzer.

Beachten Sie, dass das Flag 'g' gesetzt sein muss, um den internen Zeiger über Aufrufe hinweg zu verschieben.




Hier ist meine Funktion um die Spiele zu bekommen:

function getAllMatches(regex, text) {
    if (regex.constructor !== RegExp) {
        throw new Error('not RegExp');
    }

    var res = [];
    var match = null;

    if (regex.global) {
        while (match = regex.exec(text)) {
            res.push(match);
        }
    }
    else {
        if (match = regex.exec(text)) {
            res.push(match);
        }
    }

    return res;
}

var regex = /abc|def|ghi/g;
var res = getAllMatches(regex, 'abcdefghi');

res.forEach(function (item) {
    console.log(item[0]);
});



Benutze das...

var all_matches = your_string.match(re);
console.log(all_matches)

Es wird ein Array aller Übereinstimmungen zurückgeben ... Das würde gut funktionieren .... Aber denken Sie daran, dass keine Gruppen berücksichtigt werden. Es werden nur die vollständigen Übereinstimmungen zurückgegeben ...




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 Strings, die oft benötigt wird, wenn Benutzereingaben nach Stichwörtern und Phrasen gescannt werden.

    // 1) Define keywords
    var keywords = ['apple', 'orange', 'banana'];

    // 2) Create regex, pass "i" for case-insensitive and "g" for global search
    regex = new RegExp("(" + keywords.join('|') + ")", "ig");
    => /(apple|orange|banana)/gi

    // 3) Match it against any string to get all matches 
    "Test string for ORANGE's or apples were mentioned".match(regex);
    => ["ORANGE", "apple"]

Hoffe das hilft!




Hier ist meine Antwort:

var str = '[me nombre es] : My name is. [Yo puedo] is the right word'; 

var reg = /\[(.*?)\]/g;

var a = str.match(reg);

a = a.toString().replace(/[\[\]]/g, "").split(','));





Related