Reemplazar varios caracteres en una llamada de reemplazo


258

Pequeña pregunta muy simple, pero no entiendo cómo hacerlo.

Necesito reemplazar cada instancia de '_' con un espacio, y cada instancia de '#' con nada / vacío.

var string = '#Please send_an_information_pack_to_the_following_address:';

He intentado esto:

string.replace('#','').replace('_', ' ');

Realmente no me gusta encadenar comandos como este. ¿Hay otra forma de hacerlo en uno?


Vea la respuesta a esta pregunta: stackoverflow.com/questions/7072330/…
DeweyOx

Respuestas:


517

Use el operador OR ( |):

var str = '#this #is__ __#a test###__';
str.replace(/#|_/g,''); // result: "this is a test"

También podría usar una clase de caracteres:

str.replace(/[#_]/g,'');

Violín

Si desea reemplazar el hash con una cosa y el guión bajo con otra, entonces solo tendrá que encadenar. Sin embargo, puede agregar un prototipo:

String.prototype.allReplace = function(obj) {
    var retStr = this;
    for (var x in obj) {
        retStr = retStr.replace(new RegExp(x, 'g'), obj[x]);
    }
    return retStr;
};

console.log('aabbaabbcc'.allReplace({'a': 'h', 'b': 'o'}));
// console.log 'hhoohhoocc';

¿Por qué no encadenar, sin embargo? No veo nada malo con eso.


Esto es genial, pero necesito reemplazar los guiones bajos por espacios no vacíos, ¿puedo hacer esto?
Shannon Hochkins

Pensé que sí, pero aún así me has ayudado a entender cómo las expresiones de reemplazo funcionan un poco mejor :)
Shannon Hochkins

¿Tu prototipo no funciona? ¿puede proporcionar un ejemplo en el violín, sigo recibiendo errores?
Shannon Hochkins

3
Otra opción para #|_es [#_], y también podría usar +para emparejar cualquier partido consecutivo para mejorar el rendimiento
Ian

3
Genial, gracias ... si es necesario, reemplaza los espacios en blanco y otros símbolos str.replace(/[+ -]/g,'');solo coloca el espacio en blanco en el medio.
equiman

53

El encadenamiento es genial, ¿por qué descartarlo?

De todos modos, aquí hay otra opción en un reemplazo:

string.replace(/#|_/g,function(match) {return (match=="#")?"":" ";})

El reemplazo elegirá "" si coincide == "#", "" si no.

[Actualización] Para una solución más genérica, puede almacenar sus cadenas de reemplazo en un objeto:

var replaceChars={ "#":"" , "_":" " };
string.replace(/#|_/g,function(match) {return replaceChars[match];})

44
da un paso más: var regex = new RegExp( Object.keys(replaceChars).join("|"), "g"); string.replace(regex,function(match) {return replaceChars[match];})esto facilita la modificación de los replaceChars.
RozzA

@RozzA gracias. Object.keys no era corriente en ese momento.
Christophe

Olvidé por completo la opción de función de reemplazo para reemplazar el segundo parámetro, para ayudarme a recordar :)
Luckylooke

48

Si desea reemplazar varios caracteres, puede llamar al String.prototype.replace()con el argumento de reemplazo que es una función que se llama para cada coincidencia. Todo lo que necesita es un objeto que represente el mapeo de caracteres que usará en esa función.

Por ejemplo, si desea areemplazar con x, bcon yy ccon z, puede hacer algo como esto:

var chars = {'a':'x','b':'y','c':'z'};
var s = '234abc567bbbbac';
s = s.replace(/[abc]/g, m => chars[m]);
console.log(s);

Salida :234xyz567yyyyxz


3
Puesto que se utiliza ES6 (función de flecha) también se debe reemplazar varcon constaquí. Una alternativa para el soporte extendido del navegador:var s ='234abc567bbbbac'; s = s.replace(/[abc]/g, function(m) { return {'a':'x','b':'y','c':'z'}[m]; }); console.log(s);
Felix Geenen

1
@FelixGeenen 1. matas la portabilidad 2. si eliges redefinir caracteres o s, obtendrás un error de tiempo de ejecución, que mata su 'robustez, 3. no hay garantía para proteger s de la mutación y el reenganche que no sean puramente ideológicos. Es maravilloso ver que este fragmento seguirá funcionando en windows98 recién instalado con doble clic / cscript / wscript:var chars = {a:'1', b:'2', c:'3'}; var s = '123abc123'; var u = s.replace(/[abc]/g, function(m) { return chars[m]; }); WScript.echo(u);
Dmitry

esto es realmente bueno. Gracias. ¿Cuál es la parte donde usó un objeto para hacer una declaración o? ¿tiene documentación o referencia a algo que lo explique? Bastante buen caso de uso.
Christian Matthew

39

Especifique el /gindicador (global) en la expresión regular para reemplazar todas las coincidencias en lugar de solo la primera:

string.replace(/_/g, ' ').replace(/#/g, '')

Para reemplazar un personaje con una cosa y un personaje diferente con otra cosa, realmente no puede evitar necesitar dos llamadas separadas replace. Puede abstraerlo en una función como lo hizo Doorknob, aunque probablemente haría que tomara un objeto con viejos / nuevos como pares clave / valor en lugar de una matriz plana.


¿Cómo incluiría también el hash?
Shannon Hochkins

4

También puedes probar esto:

function replaceStr(str, find, replace) {
    for (var i = 0; i < find.length; i++) {
        str = str.replace(new RegExp(find[i], 'gi'), replace[i]);
    }
    return str;
}

var text = "#here_is_the_one#";
var find = ["#","_"];
var replace = ['',' '];
text = replaceStr(text, find, replace);
console.log(text);

findse refiere al texto a encontrar y replaceal texto a reemplazar por

Esto reemplazará los caracteres que no distinguen entre mayúsculas y minúsculas. Para hacerlo de otra manera, simplemente cambie las banderas Regex según sea necesario. Por ejemplo: para mayúsculas y minúsculas, reemplace:

new RegExp(find[i], 'g')

4

Puedes probar esto:

str.replace(/[.#]/g, 'replacechar');

esto reemplazará., - y # con su replacechar!


Esta respuesta ya se ha proporcionado y no maneja el reemplazo de diferentes caracteres con otros caracteres, vea OP.
Shannon Hochkins,

3

Aquí hay una manera simple de hacerlo sin RegEx.
Puede crear prototipos y / o almacenar en caché las cosas que desee.

// Example: translate( 'faded', 'abcdef', '123456' ) returns '61454'
function translate( s, sFrom, sTo ){
    for ( var out = '', i = 0; i < s.length; i++ ){
        out += sTo.charAt( sFrom.indexOf( s.charAt(i) ));
    }
    return out;
}

Sé que no lo dijiste, pero ¿no es mucho más elegante usar solo expresiones regulares? str.replace(/#|_/g,'')
Shannon Hochkins,

1
@ShannonHochkins ¡Seguro! No quiero criticar a RegEx; Solo estoy mostrando otra opción. RegEx no siempre es intuitivo y se presta para ser utilizado "como un martillo, tratando cada problema como un clavo". Además de mirar las otras respuestas, como una función reutilizable, esta no es mucho más larga y los parámetros son fáciles de entender. Personalmente, iría con un breve RegEx para la pregunta aquí, y tiene sentido si solo estás buscando un fragmento rápido que no te importe no entender por completo.
Beejor

Bueno, si necesita traducir un carácter ( comando a la sed y o a la Unix tr), esta parece ser la respuesta correcta.
Édouard

3

Por favor, inténtalo:

  • reemplazar múltiples cuerdas

    var str = "http://www.abc.xyz.com"; str = str.replace(/http:|www|.com/g, ''); //str is "//.abc.xyz"

  • reemplazar múltiples caracteres

    var str = "a.b.c.d,e,f,g,h"; str = str.replace(/[.,]/g, ''); //str is "abcdefgh";

¡Buena suerte!


2

También puede pasar un objeto RegExp al método de reemplazo como

var regexUnderscore = new RegExp("_", "g"); //indicates global match
var regexHash = new RegExp("#", "g");

string.replace(regexHash, "").replace(regexUnderscore, " ");

Javascript RegExp


OP no quiere encadenar replacellamadas, esto no ayuda a evitar eso.
Dennis

2

yourstring = '#Por favor envíe_un_information_pack_to_the_following_address:';

reemplace '#' con '' y reemplace '_' con un espacio

var newstring1 = yourstring.split('#').join('');
var newstring2 = newstring1.split('_').join(' ');

newstring2 es tu resultado


Su respuesta no usa una pizca de jQuery, y tampoco sigue el OP, '#esta #es__ #una prueba ### ' .split ('_'). Join ('') no funcionaría como terminarías con más espacios en blanco
Shannon Hochkins

@ShannonHochkins ¿Cómo se agregarán más espacios en blanco?
Hafsul Maru

Eche un vistazo a mi ejemplo, cuando hay un guión bajo antes de un espacio, o dos guiones bajos terminará con múltiples espacios.
Shannon Hochkins

@ShannonHochkins el interlocutor trata con la cadena '#Por favor envíe_un_información_paquete_a_la_siguiente_dirección:'; No hay espacio aquí. por qué lo pensaré cuando piense, por qué solo sobre el espacio, pueden suceder muchas otras cosas.
Hafsul Maru el

Le sugiero que vuelva a leer el OP, soy el póster original y puede ver claramente en mi primera variable var str = '#this #is__ __#a test###__';que hay varios espacios claros en esta cadena.
Shannon Hochkins

2

Aquí hay otra versión con String Prototype. ¡Disfrutar!

String.prototype.replaceAll = function(obj) {
    let finalString = '';
    let word = this;
    for (let each of word){
        for (const o in obj){
            const value = obj[o];
            if (each == o){
                each = value;
            }
        }
        finalString += each;
    }

    return finalString;
};

'abc'.replaceAll({'a':'x', 'b':'y'}); //"xyc"

1

No sé si esto ayudará, pero quería eliminar <b>y</b> de mi cadena

entonces solía

mystring.replace('<b>',' ').replace('</b>','');

Básicamente, si desea que se reduzca un número limitado de caracteres y no pierda tiempo, esto será útil.


-1

Aquí hay una función "HTML seguro" que utiliza una función de reemplazo múltiple 'reducir' (esta función aplica cada reemplazo a toda la cadena, por lo que las dependencias entre los reemplazos son significativas).

// Test:
document.write(SafeHTML('<div>\n\
    x</div>'));

function SafeHTML(str)
    {
    const replacements = [
        {'&':'&amp;'},
        {'<':'&lt;'},
        {'>':'&gt;'},
        {'"':'&quot;'},
        {"'":'&apos;'},
        {'`':'&grave;'},
        {'\n':'<br>'},
        {' ':'&nbsp;'}
        ];
    return replaceManyStr(replacements,str);
    } // HTMLToSafeHTML

function replaceManyStr(replacements,str)
    {
    return replacements.reduce((accum,t) => accum.replace(new RegExp(Object.keys(t)[0],'g'),t[Object.keys(t)[0]]),str);
    }

Gracias por la publicación, sin embargo, es bastante extensa en comparación con la respuesta aceptada
Shannon Hochkins, el

La respuesta a la pregunta es una función de una línea. ¿Cómo es eso "extenso"? Hacer que la entrada del usuario sea segura es un ejemplo importante. Eres muy crítico. 'reducir' es una técnica muy útil que debes conocer.
David Spector

Dije que su respuesta es demasiado extensa, es mucho más código, de todos modos está utilizando expresiones regulares, simplemente haciendo que el proceso sea demasiado complicado, no estoy seguro de cómo cree que su respuesta es una reducción en comparación con cualquiera de estas respuestas ...
Shannon Hochkins

Mi respuesta es 'reducir' porque usa la función Array.prototype.reduce. Una respuesta más corta podría usar una cadena en lugar de claves de propiedad, explotando el hecho de que una función de "HTML seguro" solo funciona para reemplazar caracteres individuales. Te reto a que encuentres una respuesta más elegante en lugar de quejarte groseramente en público como este.
David Spector

En realidad, le dije gracias y le critiqué, lo tomó y decidió escribir algo sarcástico, si vamos a comenzar con métodos funcionales para realizar en lugar de métodos encadenados prototípicos como deberíamos ser, entonces algo mucho más simple como: jsfiddle .net / shannonhochkins / xsm9j610 / 21
Shannon Hochkins
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.