2011-08-26 5 views
0

Bonjour,Comment supprimer un motif répété sauf le dernier avec Regex?

Je voudrais savoir si cela est possible en utilisant RegExp et si oui, comment.

Voici le problème:

Dans une chaîne, j'ai plusieurs motifs qui correspondent aux couleurs:

{r for dark red 
{R for bright red 
{G for bright green 
{W for white 
{* for black 
... and so on... 

Parfois, les données que je suis analyse contient beaucoup de couleurs inutiles change Exemple:

{r{Gthis text is finally green

Le {r est totalement inutile là. Il ne serait pas si la chaîne était {rSomething {Gthis text is finally green

Je voudrais un moyen de faire correspondre tous les {<color references> qui est juste avant toute autre {<color references> et quitte le dernier en place.

{r{Gthis text is green ->{Gthis text is green That text is {R{rdark red ->That text is {rdark red

Est-ce un moyen facile de le faire? Je suis conscient que ce problème est vraiment particulier et ne sera probablement jamais aider quelqu'un d'autre.

Mais l'aide serait vraiment apprécier.

Merci!

PS: Les codes sont utilisés dans Javascript donc si possible, je voudrais une solution fonctionnant en Javascript.

Edit:

Je dois pouvoir faire {Y{r{Gthis te{*xt {Y{yis green et obtenir {Gthis te{*xt {yis green

+1

Qu'avez-vous essayé (en d'autres termes, poster le t Javascript chapeau que vous avez jusqu'ici) –

Répondre

1

Voici une méthode qui fonctionne.Il fonctionne comme ceci:

  1. Rechercher un ou plusieurs codes de couleur suivre par un autre code couleur.
  2. Un code de couleur est considéré comme { suivi de tout autre caractère sauf un {. S'il y a seulement un ensemble spécifié de codes de couleur que vous voulez autoriser ou s'il y a plus de caractères qui ne sont pas des codes de couleur autorisés, alors ceux-ci pourraient également être ajoutés à la regex, mais vous n'avez pas précisé ces informations.
  3. La regex pour un code de couleur unique est la suivante: \{[^\{]. Il s'agit d'un { suivi de n'importe quel caractère qui n'est pas {. Si vous voulez que ce ne soit que des caractères alpha, vous pouvez le changer en: \{[a-zA-Z].
  4. Remplacez les codes de couleur consécutifs multiples par le dernier code couleur en utilisant les sous-correspondances de la correspondance.
  5. Cette technique supprimera tous les codes de couleurs, sauf le dernier, même s'il y a plus de deux codes de couleur dans une rangée.
  6. Cette technique ne supprime pas les éléments qui ne ressemblent pas à des codes de couleur valides comme {{.

Ceci fonctionne pour n'importe quel caractère dans le code de couleur puisque vous aviez l'air d'avoir une longue liste de codes de caractères uniques valides. Mais, il protège contre {{qu'il ne traitera pas comme un code de couleur.

var str = "{r{G{ythis text is finally green"; 
var result = str.replace(/(\{[^\{])+(\{[^\{])/g, "$2"); 

ou pour permettre à des caractères seulement alpha pour être un caractère de code couleur, ce serait ceci:

var result = str.replace(/(\{[a-zA-Z])+(\{[a-zA-Z])/g, "$2"); 

Vous pouvez voir un violon test ici: http://jsfiddle.net/jfriend00/jNXUz/

+0

Je teste quelques possibilités mais jusqu'à présent, ça marche! – Cybrix

0
var foo = "{r{Gthis text is green".replace(/^{(.+){/, '{'); 
console.log(foo); 
+0

Cela fonctionne presque. Mais une partie de la chaîne est supprimée lors de l'utilisation: '{{{{Gthis te {* xt {Y {yis vert' ->' {yis green' – Cybrix

0

Du haut de ma tête j'utiliser une expression régulière comme ([\{a-zA-Z]{2})([{A-Za-z\ ]+) vous dépouiller ensuite le groupe 1 , ou juste extraire le groupe 2.

L'expression régulière que j'ai donnée n'est pas aussi concise qu'elle pourrait l'être, mais c'est à vous de faire meilleur et plus particulier à vos besoins. Essayez d'utiliser quelque chose comme buddy regex pour aider au développement ultérieur.

0

Utilisez cette option si vous souhaitez autoriser { dans vos cordes aussi bien si ce n'est pas suivi par l'un de vos personnages spéciaux:

var patts = ['\\{r', 
      '\\{R', 
      '\\{G', 
      '\\{W', 
      '\\{\\*']; 
var str = '{r{GThis is a green string'; 
var patt = '(?:'+patts.join('|')+')'; 
str = str.replace(new RegExp(patt+'('+patt+')', 'g'), '$1'); 
// str === "{GThis is a green string" 
0

Vous pouvez rechercher où le code d'une couleur est immédiatement suivi par un autre, et supprimez le premier comme dans le code suivant:

// if you want to list out all possible codes 
"{r{Gthis text is finally green".replace(/{[rRGW\*]{/g,"{"); 

// if you want a generic any character after bracket match 
"{r{Gthis text is finally green".replace(/{.{/g,"{"); 
0

Vous pouvez le faire comme donc: http://jsfiddle.net/BdWt5/

var patterns = { 
    r:function(a){ 
    // dark red implementation 
    return '<span style=color:red>'+a+'</span>'; 
    }, 
    G:function(a){ 
    // green implementation 
    return '<span style=color:green>'+a+'</span>'; 
    } 
}; 

var str = '{rTesting{GTesting}}',match; 

while(match = str.match(/{([^{}]+)}/)){ 
    str=str.replace(match[0],patterns[match[1].slice(0,1)](match[1].slice(1))) 
} 
Questions connexes