8 Stimmen

Suche nach allen übereinstimmenden Regex-Mustern und dem Index der Übereinstimmung in der Zeichenkette

Ich möchte finden /AA/ Muster in AA-AA-AA Betreffzeile. Ich muss die übereinstimmende Zeichenfolge und die Position (Index) der Übereinstimmung ermitteln.

Ich habe mir angesehen RegExp.prototype.exec() . Es wird nur die erste Übereinstimmung zurückgegeben:

/AA/g.exec('AA-AA-AA')

19voto

bobince Punkte 512550

exec() liefert nur einen einzigen Treffer. Um alle Übereinstimmungen mit einem g lobal regexp, müssen Sie es wiederholt aufrufen, z. B.:

var match, indexes= [];
while (match= r.exec(value))
    indexes.push([match.index, match.index+match[0].length]);

3voto

Gajus Punkte 61796

Seien Sie vorsichtig bei der Verwendung von RegExp.prototype.exec() Funktion, um eine Zeichenfolge zu finden. Das konstruierte Regex-Objekt ist zustandsabhängig, d.h. jedes Mal, wenn Sie die Funktion .exec() wirkt es sich auf die lastIndex Eigenschaft der Regex-Instanz. Daher sollten Sie immer die lastIndex Eigenschaft, bevor Sie eine Instanz des Regex-Objekts verwenden.

let re,
    findAAs;

re = /AA/;

findAAs = (input) => {
    let match;

    // `re` is cached instance of regex object.
    // Reset `re.lastIndex` every time before using it.

    re.lastIndex = 0;

    while ((match = re.exec(input)) !== null) {
        match.index; // Match index.
        match[0]; // Matching string.
    }
};

Eine verlockende Alternative ist, das Regex-Objekt bei jeder Ausführung zu konstruieren. Je nachdem, wie ressourcenintensiv Ihre Aufgabe ist, ist auch dies eine Option.

let findAAs;

findAAs = (input) => {
    let match,
        re;

    re = /AA/;

    while ((match = re.exec(input)) !== null) {
        match.index; // Match index.
        match[0]; // Matching string.
    }
};

Eine pragmatische Alternative zur Verwendung .exec() es String.prototype.replace() .

let findAAs,
    re;

re = /AA/;

findAAs = (input) => {
    let match,
        re;

    input.replace(re, (match, index) => {
        match; // Matching string.
        index; // Match index.

        return '';
    });
};

Der Nachteil dieses Ansatzes ist, dass eine Kopie der Betreff-Zeichenkette erstellt wird.

Ob Sie es verwenden sollten oder nicht, hängt davon ab, wie ressourcenintensiv Ihre Aufgabe ist. Ich persönlich vermeide gerne while Blöcke in meinem Code und bevorzuge daher die .replace() Ansatz.

0voto

mplungjan Punkte 153338

http://jsfiddle.net/mplungjan/MNXvQ/

Ich denke, dies ist leichter zu verstehen

var str = "AAbAAcAAd"
var re = /(AA)/gi;
var t="",cnt=0;
while ((result=re.exec(str))!=null) {
    document.write((cnt++)+":"+result[1]+"<br />")        
}

re.lastIndex enthält die Positionen jedes Mal

0voto

Scott Wager Punkte 492

Eine Alternative zur Antwort von bobince ist die Verwendung der Eigenschaft "lastIndex" des Regex, um den Endindex jeder Übereinstimmung zu ermitteln

var match, indexes= [];
while (match = r.exec(value)) {
    indexes.push([match.index, r.lastIndex]);
}

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