2009-12-27 8 views
106

tengo este¿Por qué javascript reemplaza solo la primera instancia cuando se usa reemplazar?

var date = $('#Date').val(); 

este obtener el valor en el cuadro de texto lo que se vería así

12/31/2009

Ahora hago esto en él

var id = 'c_' + date.replace("/", ''); 

y el resultado es

c_1231/2009

Se echa de menos el último '/' No entiendo por qué.

+0

título editado para ser un poco más descriptivo, pero es tu pregunta, por lo que eres el jefe. : D –

+1

Posible duplicado de [Reemplazar todas las apariciones de una cadena en JavaScript] (http://stackoverflow.com/questions/1144783/replacing-all-occurrences-of-a-string-in-javascript) – chharvey

+0

Esto es tan doloroso e innecesario. Me pregunto qué razón hubo para implementar 'reemplazar' como este. Incluso elijo 'str.split (search) .join (replacement)' sobre la expresión regular. –

Respuesta

193

Es necesario configurar el g flag para reemplazar a nivel mundial:

date.replace(new RegExp("/", "g"), '') 
// or 
date.replace(/\//g, '') 

otro caso, sólo se reemplazará la primera aparición.

+0

Por qué la diferencia luego reemplaza C#. Pensé que reemplazaría todas las ocurrencias por defecto. ¿Pero por qué se llevaron 2 barras si solo es la primera vez? – chobo2

+2

@ chobo2 no quitó dos barras. Solo había dos para empezar, y eliminó el primero. –

+4

@ chobo2: Bueno, JavaScript no es C#. Y '31/31/2009' solo contiene dos barras inclinadas. – Gumbo

65

A diferencia de la biblioteca de clases C#/.NET (y la mayoría de los demás lenguajes sensibles), cuando pasa un String como argumento de cadena por coincidencia al método string.replace, no reemplaza una cadena. Convierte la cadena a RegExp y realiza una sustitución de expresiones regulares. Como explica Gumbo, una sustitución de expresiones regulares requiere la bandera lobal g, que no está activada por defecto, para reemplazar todas las coincidencias de una vez.

Si quieres una auténtica basada en cadena de reemplazar - por ejemplo, porque la secuencia de correspondencia es dinámico y puede contener caracteres que tienen un significado especial en regexen - el lenguaje Javascript para lo que vale:

var id= 'c_'+date.split('/').join(''); 
+2

Si realmente desea impulsar este tipo de funcionalidad, puede intentar algo como 'String.prototype.strReplace = function (needle, replacement) {return this.split (needle) .join (replacement ||" ");}; 'Entonces podría' var id = "c_" + date.strReplace ("/") ' – Patrick

+0

Me gusta más la explicación en esto que cualquier otra respuesta a preguntas similares. La respuesta aceptada solo proporciona una solución, no una respuesta a 'Por qué' como en el título. – JakeJ

+0

Esto solo parece funcionar en las primeras dos instancias de mi cadena de búsqueda ... todas las demás se ignoran ... ?? (¿Importa que mi instancia de búsqueda tenga varios caracteres? –

5

Usted puede usar:

String.prototype.replaceAll = function(search, replace) { 
if (replace === undefined) { 
    return this.toString(); 
} 
return this.split(search).join(replace); 
} 
Cuestiones relacionadas