[RegExp] - 1. oder 2. Vorkommen erstzen

k3nguruh

Erfahrenes Mitglied
Hallo,

RegExp ist nicht gerade mein Ding. Nach langem Suchen konnte ich bis jetzt keine passende Antwort für mich finden. Ich hoffe, dass ich hier Hilfe bekomme...

[NEW] kann [0] , [NEW] oder [NEW1] , [NEW2] .... sein.

derzeit verwende ich folgendes:
Javascript:
var String = "abcd[NEW][efghij]";

String.replace(/\[(0|NEW|NEW\d+)\]/, '[NEW' + i + ']')); // i => ist ein Schleifenzähler

jetzt möchte ich gerne je nach "level" das 1'te bzw. das 2'te vorkommen ersetzen.
Javascript:
var level = 1; // kann auch 2 sein
var String = "abcd[NEW][efghij][NEW][klmno]";

// level = 1
// abcd[NEW1][efghij][NEW][klmno]

// level = 2
// abcd[NEW][efghij][NEW1][klmno]

Über jegliche hilfe wäre ich dankbar
 
Offenbar unterstützt Javascript keine Nummer im Modifier. Die einzige Lösung, die ich sehe, ist, den String mit match() und split() zu zerlegen und dann im richtigen Bestandteil zu ersetzen:
Code:
var level = 1; // kann auch 2 sein
var str = "abcd[NEW][efghij][NEW][klmno]";
var re = /\[(0|NEW\d?)\]/;
var re2 = /\[(0|NEW\d?)\]/g;
var parts1 = str.match(re2);
var parts2 = str.split(re);
var result = "";
parts1[level - 1].replace(re, '[NEW' + i + ']');
for (i = 0; i <  parts2.length; i++) result += parts2[i] + parts1[i];
Mal gespannt, ob noch jemand eine einfachere Lösung findet.
 
Du kannst an String.replace auch eine Callback-Funktion als zweites Argument übergeben. Diese zählt mit, wie oft sie schon aufgerufen wurde und kann je nachdem den Originaltextteil zurückgeben oder diesen durch einen neuen ersetzen lassen:

Auf jsFiddle
Javascript:
function replaceArrayIndex(str, level, newIndex) {
    var count = 0;
    function replacer(match, origArrayIndex, offset, fullStr) {
        count++;
        if (count == level) {
            return 'NEW' + newIndex;
        }
        else {
            return origArrayIndex;
        }
    }
    
    return str.replace(/(\[0|NEW|NEW\d+\])/g, replacer);
}

var str = "abcd[NEW][efghij][NEW][klmno]";
alert(replaceArrayIndex(str, 1, 99));

Beachte, dass ich die Klammern im regulären Ausdruck nun vor bzw. nach die eckigen Klammer verschoben habe. Außerdem habe ich den 'g'-Modifier hinzugefügt, denn ansonsten wird nach dem ersten Fund gar nicht mehr weiter gesucht.
 

Neue Beiträge

Zurück