2010-11-26 19 views
11

Estoy alterado por regex Creo que soy disléxico cuando se trata de estos horribles bits de código ... de todos modos, debe haber una manera más fácil de hacer esto- (es decir, enumerar un conjunto de instancias de reemplazo en una línea), ¿alguien? Gracias por adelantado.Multiple Regex replace

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

¿Puede darnos algunos ejemplos de entrada? – Shekhar

+1

¿Qué estás tratando de hacer realmente? – Gumbo

Respuesta

10

Se puede definir ya sea una función genérica, lo cual tendría sentido si se puede reutilizar en más partes de su código, lo que hace que se seque. Si no tiene un motivo para definir uno genérico, comprimiría solo la parte que limpia las secuencias y deja que el otro las reemplace tal como están.

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; 
} 

Pero tenga cuidado, el orden de los reemplazos se cambiaron en el código .. aunque parece puede ser que no afecta el resultado.

0

Se podía hacerlo de esta manera:

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; 
} 

Tenga en cuenta que el orden de las propiedades del objeto no es determinado con fiabilidad (pero la mayoría de las implementaciones de ellos volverá a fin de definición). Probablemente necesite múltiples construcciones como esta si necesita asegurar un orden específico.

27

Podría reemplazar el dispositivo. Para cada coincidencia, la función decide con qué debe reemplazarse.

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 Estoy utilizando los grupos de captura en la devolución de llamada de reemplazo, por lo que no es necesario un comentario sobre el uso de grupos no capturados. Estoy revirtiendo este cambio. –

0

... tiene que haber una manera más fácil de hacer esto: (es decir. Enumerar un conjunto de reemplazar casos en una sola línea) ...

Yum, API- primero pensando. Qué tal si...?

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

Fontanería:

// 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); 
    }; 
}