2010-10-10 3 views
2

Je cherche à faire quelque chose comme:Permutation un personnage à un autre dans Regex/Javascript

var a = "This is an A B pattern: ABABA"; 
a.replace("A", "B"); 
a.replace("B", "A"); 

et ont le retourner:
=> "Ceci est un modèle BA: BABAB"
au lieu de :
=> "Ceci est un modèle AA: AAAAA"

Ma première pensée est de faire quelque chose comme:

a.replace("A", "improbablePattern"); 
a.replace("B", "A"); 
a.replace("improbablePattern", "B"); 

Comment dois-je vraiment le faire?

Répondre

2

Vous pouvez passer une fonction à votre appel .replace() avec l'expression régulière qui correspond à la fois, comme ceci:

var a = "This is an A B pattern: ABABA"; 
a = a.replace(/(A|B)/g, function(a, m) { return m == "A" ? "B" : "A"; }); 
alert(a);​ //alerts "This is an B A pattern: BABAB" 

You can try it out here

0

Ce n'est pas quelque chose qui est un regex adapté. Peu importe comment vous l'activez, vous avez besoin d'au moins trois opérations de remplacement distinctes, ce qui signifie la compilation et l'exécution de trois regex, et trouver un modèle prouvant qu'il n'y a pas de collision pour le remplacement intermédiaire est un problème. Non, dans ce cas, vous devez vous-même séparer la chaîne et traduire tous les caractères souhaités en une fois. Beaucoup plus efficace et raisonnable.

(C'est, à moins que Javascript a un certain opérateur Perl comme tr que je ne connaissais pas.)

+1

Ce n'est pas vraiment vrai, voir soit la réponse de mon ou Gumbo pour réfuter la théorie du remplacement triple. –

1

Vous devez faire tous les remplacements à la fois. Vous pouvez utiliser quelque chose comme ça pour le faire:

String.prototype.translate = function(translation) { 
    var names = []; 
    for (var search in translation) { 
     if (translation.hasOwnProperty(search)) { 
      names.push(search.replace(/([.\\+*?[^\]$(){}=!<>|:\-])/g, "\\$1")); 
     } 
    } 
    var re = new RegExp("(?:" + names.join("|") + ")", "g"); 
    return this.replace(re, function(val) { return translation[val]; }); 
} 

var text = "This is an A B pattern: ABABA", 
    translation = { 
     "A": "B", 
     "B": "A" 
    }; 
text = text.translate(translation); 

Voici translation est une application de vieux sur de nouvelles valeurs. Utilisez ceci avec la méthode translate définie ici sur les chaînes pour faire la traduction. Les noms de propriété de l'objet translation transmis sont utilisés pour générer une expression régulière de la forme (?:name1|name2|…|nameN). Cette expression régulière est ensuite utilisée pour le remplacement tandis qu'une fonction supplémentaire est utilisée pour renvoyer la nouvelle valeur correspondant à la valeur correspondante.

Questions connexes