2009-02-12 7 views
49

Quiero realizar una sustitución global de cadena utilizando String.replace en Javascript.En Javascript, ¿cómo puedo realizar una sustitución global en cadena con una variable dentro de '/' y '/ g'?

En la documentación leí que puedo hacer esto con/g, es decir, por ejemplo;

var mystring = mystring.replace(/test/g, mystring); 

y esto reemplazará todas las ocurrencias dentro de mystring. Sin citas para la expresión.

Pero si tengo una variable para encontrar, ¿cómo puedo hacer esto sin comillas?

He intentado algo como esto:

var stringToFind = "test"; 

// primer intento

mystring = mystring.replace('/' + stringToFind + '/g', mystring); 

// segundo intento, no hay mucho sentido en absoluto

mystring = mystring.replace(/stringToFind/g, mystring); 

pero Don no funciona ¿Algunas ideas?

+2

Su pregunta se responde aquí : http://stackoverflow.com/questions/494035/how-do-you-pass-a-variable-to-a-regular-expression-javascript/494046 –

Respuesta

-9

¿Se puede usar prototype.js? Si es así, puede usar String.gsub, como

var myStr = "a day in a life of a thing"; 
var replace = "a"; 
var resultString = myStr.gsub(replace, "g"); 
// resultString will be "g day in g life of g thing" 

También tomará expresiones regulares. Para mí, esta es una de las formas más elegantes de resolverlo. prototypejs gsub documentation

+11

Hay una solución ** mucho ** más simple que realmente bastante eficiente: 'myStr.split ('a'). Join ('g')'. No requiere prototype.js tampoco. – cloudfeet

+2

Esta no es una respuesta útil ya que hay formas fáciles de cumplir con los estándares para lograr lo mismo. – rmcclellan

+0

@cloudfeet: De hecho, es una solución muy simple, pero me pregunto cuál será más eficiente: utilizando un objeto RegExp (solución de Paolo Bergantino a continuación) o su solución que crea una matriz sobre la marcha y luego se une a los elementos de la matriz. –

150
var mystring = "hello world test world"; 
var find = "world"; 
var regex = new RegExp(find, "g"); 
alert(mystring.replace(regex, "yay")); // alerts "hello yay test yay" 
+2

¡Este me ayudó! – Ropstah

+0

¡También me ayudó! – KClough

+0

Lo mismo aquí, gracias! –

1

Probar:

var stringToFind = "test"; 
mystring = mystring.replace(new RegExp(stringToFind, "g"), mystring); 
+0

Supongo que el último 'mystring' en el reemplazo no es lo que quiso decir? – KooiInc

3

eso es una expresión regular, no una cadena. Use el constructor para un objeto RegExp para crear dinámicamente una expresión regular.

var r = new RegExp(stringToFind, 'g'); 
mystring.replace(r, 'some replacement text'); 
57

Para expresiones regulares, new RegExp(stringtofind, 'g');. PERO. Si 'buscar' contiene caracteres que son especiales en expresiones regulares, tendrán su significado real. Entonces, si trataste de reemplazar el '.' en 'abc.def' con 'x', obtendrías 'xxxxxxx' - ¡Ups!

Si todo lo que quiere es un simple reemplazo de cadenas, ¡no hay necesidad de expresiones regulares! Aquí está el modificador de cadena simple:

mystring= mystring.split(stringtofind).join(replacementstring); 
+0

+1 Siempre es bueno ver a la gente pensando más allá de la respuesta literal a la pregunta. – Thomas

+0

Me pregunto cómo esto se degrada para cadenas más grandes en comparación con la llamada RegExp()? – Kato

+0

+1 en una forma creativa de resolver el problema. También me interesaría el punto de referencia, pero apostaría por la mayoría de los propósitos que esto es bastante efectivo. – Jesse

13
String.prototype.replaceAll = function (replaceThis, withThis) { 
    var re = new RegExp(RegExp.quote(replaceThis),"g"); 
    return this.replace(re, withThis); 
}; 


RegExp.quote = function(str) { 
    return str.replace(/([.?*+^$[\]\\(){}-])/g, "\\$1"); 
}; 

var aa = "qwerr.erer".replaceAll(".","A"); 
alert(aa); 

silmiar post

+0

+1 para una implementación de replaceAll – Seth

+2

Mi implementación es un poco más estricta 'str.replace (/ [\ - \ [\] \ /\{\}\(\)\*\+\?\.\,\\\\\$\|\#\s]/g, '\\ $ &') ' –

1

dinámica mundial reemplazar

Vine a este hilo en busca de una solución un poco más complejo que no ha sido respondida aquí. Ahora encontré la respuesta, así que la publicaré en caso de que alguien más la encuentre útil.

Quería hacer una sustitución global dinámica, donde las cadenas de reemplazo se basan en las coincidencias originales.

Por ejemplo, para poner en mayúscula la primera letra de todas las palabras (por ejemplo, "cat sat mat mat" en "Cat Sat Mat") con un reemplazo de búsqueda global. He aquí cómo hacer eso.

function capitaliseWords(aString) { 
    // Global match for lowercase letters following a word boundary 
    var letters = aString.match(/\b[a-z]/g), i, letterMatch; 
    // Loop over all matched letters 
    for(i = 0; i < letters.length; i++) { 
     // Replace the matched letters with upper case versions 
     letterMatch = new RegExp('\\b'+letters[i]); // EDIT - slight fix 
     aString = aString.replace(letterMatch, letters[i].toUpperCase()); 
    } 
    // Return our newly capitalised string 
    return aString; 
} 

alert(capitaliseWords("cat sat mat")); // Alerts "Cat Sat Mat" 
30

Las expresiones regulares son mucho más lentas que la búsqueda de cadenas. Por lo tanto, crear expresiones regulares con cadena de búsqueda escapada no es una forma óptima. Incluso el bucle de la cadena sería más rápido, pero sugiero usar métodos precompilados incorporados.

Aquí está una manera rápida y limpia de hacer rápida cadena de reemplazo global:

sMyString.split(sSearch).join(sReplace); 

Y eso es todo.

+2

¡Excelente solución! – wortwart

0

Puede hacerlo utilizando siguiente método

ver esta función:

function SetValue() 
{ 
    var txt1='This is a blacK table with BLack pen with bLack lady'; 
    alert(txt1); 
    var txt2= txt1.replace(/black/gi,'green'); 
    alert(txt2); 
} 

sintaxis:

/SEARCH_STRING/{g | gi}

donde

  • g es
  • gi mundial entre mayúsculas y minúsculas de reemplazo es blobal entre mayúsculas y minúsculas reemplazo

Puede comprobar este enlace JSBIN

http://jsbin.com/nohuroboxa/edit?html,js,output

Cuestiones relacionadas