2010-11-26 7 views
11

Je suis bogué par regex Je pense que je suis dyslexique quand il s'agit de ces horribles bits de code .. de toute façon, il doit y avoir un moyen plus facile de faire ceci (liste d'un ensemble d'instances de remplacement dans une ligne), quelqu'un? Merci d'avance.Multiple Regex remplacer

function clean(string) { 
    string = string.replace(/\@[email protected]/g, '').replace(/}/g, '@[email protected]'); 
    string = string.replace(/\@[email protected]/g, '').replace(/{/g, '@[email protected]'); 
    string = string.replace(/\@[email protected]/g, '').replace(/\"/g, '@[email protected]'); 
    string = string.replace(/\@[email protected]/g, '').replace(/\:/g, '@[email protected]'); 
    string = string.replace(/\@[email protected]/g, '').replace(/\,/g, '@[email protected]'); 
    return string; 
} 
+0

Pouvez-vous s'il vous plaît fournir une entrée d'échantillon? – Shekhar

+1

Qu'essayez-vous vraiment de faire? – Gumbo

Répondre

10

Vous pouvez définir soit une fonction générique, ce qui serait logique si vous pouvez le réutiliser dans d'autres parties de votre code, rendant ainsi SEC. Si vous n'avez pas de raison de définir un générique, je ne compresserais que la partie qui nettoie les séquences et laisse les autres remplacer comme elles sont.

function clean(string) { 
    string = string.replace(/\@[email protected]|\@[email protected]|\@[email protected]|\@[email protected]|\@[email protected]/g, '') 
     .replace(/}/g, '@[email protected]').replace(/{/g, '@[email protected]') 
     .replace(/\"/g, '@[email protected]').replace(/\:/g, '@[email protected]') 
     .replace(/\,/g, '@[email protected]'); 
    return string; 
} 

Mais attention, l'ordre des remplacements ont été changés dans ce code .. bien qu'il semble ils pourraient ne pas influer sur le résultat.

0

Vous pouvez le faire comme ceci:

function clean(str) { 
    var expressions = { 
     '@[email protected]': '', 
     '}':  '@[email protected]', 
     // ... 
    }; 

    for (var key in expressions) { 
     if (expressions.hasOwnProperty(key)) { 
      str = str.replace(new RegExp(key, 'g'), expressions[key]); 
     } 
    } 

    return str; 
} 

Gardez à l'esprit que l'ordre des propriétés de l'objet n'est pas fiable déterminable (mais la plupart des implémentations les retourner dans l'ordre de définition). Vous aurez probablement besoin de plusieurs constructions comme celle-ci si vous avez besoin d'un ordre spécifique.

0

Vous pouvez simplement les chaîner dans l'ordre.

function clean(string) { 
    return string.replace(/\@[email protected]/g, '').replace(/}/g, '@[email protected]') 
       .replace(/\@[email protected]/g, '').replace(/{/g, '@[email protected]') 
       .replace(/\@[email protected]/g, '').replace(/\"/g, '@[email protected]') 
       .replace(/\@[email protected]/g, '').replace(/\:/g, '@[email protected]') 
       .replace(/\@[email protected]/g, '').replace(/\,/g, '@[email protected]'); 
} 
27

Vous pouvez utiliser un remplacement de fonction. Pour chaque match, la fonction décide avec quoi elle doit être remplacée.

function clean(string) { 
    // All your regexps combined into one: 
    var re = /@(~lb~|~rb~|~qu~|~cn~|-cm-)@|([{}":,])/g; 

    return string.replace(re, function(match,tag,char) { 
     // The arguments are: 
     // 1: The whole match (string) 
     // 2..n+1: The captures (string or undefined) 
     // n+2: Starting position of match (0 = start) 
     // n+3: The subject string. 
     // (n = number of capture groups) 

     if (tag !== undefined) { 
      // We matched a tag. Replace with an empty string 
      return ""; 
     } 

     // Otherwise we matched a char. Replace with corresponding tag. 
     switch (char) { 
      case '{': return "@[email protected]"; 
      case '}': return "@[email protected]"; 
      case '"': return "@[email protected]"; 
      case ':': return "@[email protected]"; 
      case ',': return "@[email protected]"; 
     } 
    }); 
} 
+0

@Fred Gandt J'utilise les groupes de capture dans le rappel de remplacement, donc un commentaire sur l'utilisation de groupes non-capturants n'est pas nécessaire. Je reviens sur ce changement. –

0

... il doit y avoir un moyen plus facile de le faire this- (ie. La liste un ensemble de remplacer cas en une ligne) ...

Yum, API- première réflexion. Que diriez-vous...?

var clean = multiReplacer({ 
    "@[email protected]": "", 
    "@[email protected]": "", 
    "@[email protected]": "", 
    "@[email protected]": "", 
    "@[email protected]": "", 
    "}": "@[email protected]", 
    "{": "@[email protected]", 
    "\\": "@[email protected]", 
    ":": "@[email protected]", 
    ",": "@[email protected]" 
}); 

Plomberie:

// From http://simonwillison.net/2006/Jan/20/escape/ 
RegExp.escape = function(text) 
{ 
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 
}; 

function multiReplacer(replacements) 
{ 
    var regExpParts = []; 
    for (prop in replacements) 
    { 
     if (replacements.hasOwnProperty(prop)) 
     { 
      regExpParts.push(RegExp.escape(prop)); 
     } 
    } 

    var regExp = new RegExp(regExpParts.join("|"), 'g'); 
    var replacer = function(match) 
    { 
     return replacements[match]; 
    }; 

    return function(text) 
    { 
     return text.replace(regExp, replacer); 
    }; 
}