Hi!
neuString=altString.replace(/(_)([a-zA-Z]+)(_)/g,values["$2"]);
Das geht so nicht. replace() ersetzt den gefundenen String durch den zweiten und ersetzt darin $1, $2 usw. durch die Treffer der Klammern - soweit klar. Das Typen-Schema ist: string.replace(regexp, string)
Wenn du da jetzt values["$2"] schreibst, dann löst JavaScript diesen Ausdruck erst auf. Aber höchstwahrscheinlich hat das values-Objekt keinen Member mit dem Namen »$2« (da wird noch nichts ersetzt, deswegen wird der String genau so benutzt), deshalb ergibt values["$2"] == undefined. Dieses »Ergebnis« muss aber einen String ergeben.
Das heißt, deine Aufgabe kannst du mit replace() nicht umsetzen. Du kannst stattdessen erst mit exec() den Namen extrahieren. Den hast du dann als String, mit dem kannst du aus dem values-Objekt die entsprechende Ersetzung holen. Dann wendest du replace() mit replace(platzhaltername, values[platzhaltername]) an. $2 usw. brauchst du dann gar nicht.
Mathias