L'idée est de pouvoir remplacer une chaîne de caractère du style '${VARIABLE}' par une valeur définie dans le code (ou autrement). Cela ne peut être fait simplement en utilisant String.replace(), du coup une autre méthodologie doit être appliquée...

Pour solutionner ce problème, il faut remonter aux sources, à savoir directement dans la classe RegExp ! Et c'est la méthode exec() qui fournit toutes les données nécessaires, à savoir un tableau contenant un match de l'expression (avec ses groupes), l'index du match dans la chaîne et la chaîne elle-même.

var source:String = "My name is ${NAME}.";
var regexp:RegExp = /\${(.*?)}/g;
 
var result:Object = regexp.exec(source); //exécution de la regexp
if (result != null) //check s'il y a un résultat
{
   var variable:String = result[1]; //récupère le 1er groupe délimité par les parenthèses (NAME)
   var startIndex:int = result.index;
   var endIndex:int = regexp.lastIndex;
 
   source = source.substring(0, startIndex) + "Cédric" + source.substring(endIndex, source.length);
}
trace(source); //My name is Cédric.

Cela fait bien ce qui est demandé. Pour étendre le code à plusieurs variables, il suffit d'y ajouter une boucle :

var source:String = "My name is ${NAME} and here is ${OTHER_VARIABLE} again.";
var regexp:RegExp = /\${(.*?)}/g;
 
var result:Object = regexp.exec(source); //exécution de la regexp
while (result != null) //check s'il y a un résultat
{
   var variable:String = result[1]; //récupère le 1er groupe délimité par les parenthèses (NAME)
   var startIndex:int = result.index;
   var endIndex:int = regexp.lastIndex;
 
   source = source.substring(0, startIndex) + "Cédric" + source.substring(endIndex, source.length);
   result = regexp.exec(source); //réexecution de la regexp sur la suite de la chaîne
}
trace(source); //My name is Cédric and here is Cédric again.

La méthode fonctionne bien (il reste à ajouter le check du nom de variable et à corriger les index), mais c'est très lourd à lire et pas vraiment intuitif.

Afin de diminuer le code et augmenter la lisibilité, j'ai créé une petite classe nommée Matcher (cf annexes) qui permet de faciliter ce genre de chose :

import ch.capi.utils.*;
 
var source:String = "My name is ${NAME} and here is ${NAME} again.";
var regexp:RegExp = /\${(.*?)}/g;
 
var m:Matcher = new Matcher(regexp, source);
while (m.find())
{
	//pour chaque instance trouvée, on remplace par une valeur quelconque
	m.appendReplacement("Cédric"); 
}
//ajout de la fin de la chaîne
m.appendTail();
 
trace(m); //My name is Cédric and here is Cédric again.

Pour les connaisseurs, cette classe est très proche de celle en Java qui fait exactement la même chose.

La dernière étape est donc de remplacer ces variables par des valeurs prédéfinies (et non pas codée en dur comme jusqu'a présent) ! C'est là qu'intervient ma deuxième petite classe, nommée VariableReplacer, qui permet de faire ce genre de chose très simplement :

import ch.capi.utils.*;
 
var replacer:VariableReplacer = new VariableReplacer();
replacer.variables.put("NAME", "Tabin");
replacer.variables.put("FIRST_NAME", "Cédric");
 
var str:String = "My name is ${NAME} and my firstname is ${FIRST_NAME}.";
var rep:String = replacer.replaceVars(str);
trace(rep); //My name is Tabin and my firstname is Cédric.

Par défaut, les variables doivent être de la forme ${VARIABLE} mais cela peut être très facilement changé en modifiant l'expression régulière. Par ailleurs ces deux classes fournissents quelques autres fonctionnalités très utiles qui sont documentées. Elles feront également partie de la prochaine révision de Masapi !