Alexander (HH): replace mit Platzhalter

Beitrag lesen

Moin Moin!

in einem String Platzhalter von a0 - a99 mit den Werten aus einem Array ersetzen.

for(x = 0; x <= 99; x++)
{
s = s.replace(/a' + x + '/gi, a[x]);
}

Problem 1:

Dein Code sucht in s den Ausdruck "a' + x + '", Du willst aber "a0" bis "a99" suchen.

Lösungsansatz:

RegExp-Objekt "von Hand" erzeugen: re=new RegExp("a"+i);

Siehe SelfHTML -> Javascript -> Objekt-Referenz -> RegExp

Problem 2:

Deine Idee sucht erst nach a0, a1, .. a9. Ein "a10" wird schon als "a1" erkannt und ersetzt sein, wenn die Suche dort ankommt. Das gilt sinngemäß auch für a11 bis a99.

Lösungsansätze:
* Schleife rückwärts von 99 bis 0 laufen lassen
* "a00" bis "a09" statt "a0" bis "a9" verwenden
* Klammern: "a[2]", "a[20]" statt "a2", "a20"

Problem 3:

100 Schleifendurchläufe, die sich je nach Array-Werten auch noch verheddern können, weil sie die eingesetzten Werte auch nochmal bearbeiten.

Lösungsansatz:

RegExp-Objekt flexibler nutzen. Beginne mit dem Pattern /a(\d{1,2})/ (ungeklammert) oder /a[(\d{1,2})]/ (eckige Klammern), nutze die $1-Eigenschaft des RegExp-Objekts und nimm dessen numerischen Wert als Index für das Array. a[parseInt($1,10)] sollte diesen Part erledigen.

Der einzige Haken bei diesem Ansatz ist, dass Replace wohl keinen Ausdruck als Ersatz akzeptiert, sondern nur einen String.

In Perl würde man die ganze Aktion mit diesem Einzeiler erschlagen:

$s=~s/a[(\d{1,2})]/$a[$i]/gie; # geklammert
$s=~s/a(\d{1,2})/$a[$i]/gie; # ungeklammert

Alexander