2010-03-06 22 views
353

quiero reemplazar todas las ocurrencias de un punto (.) en una cadena de JavaScriptPara sustituir todos los puntos de una cadena mediante JavaScript

Por ejemplo, tengo:

var mystring = 'okay.this.is.a.string'; 

quiero obtener: okay this is a string.

Hasta ahora he intentado:

mystring.replace(/./g,' ') 

pero esto termina con toda la cadena reemplazado a los espacios.

+6

de aefxx es correcto, pero al igual que un FYI es que el carácter del período en una expresión regular significa emparejar _todo_, por lo tanto, todo es un espacio. Escapar con la barra invertida significa coincidir en los períodos. – swilliams

+0

Gracias por la sugerencia. Tengo algunos momentos AHA (cuando construyo la aplicación) con Regex. Realmente lo odio * _ *, ¿tienes algún buen y genial tutorial? –

+0

rubular.com es lo que está buscando – LanguagesNamedAfterCofee

Respuesta

636

Necesita escapar del . porque tiene el significado de "un carácter arbitrario" en una expresión regular.

mystring.replace(/\./g,' ') 
+21

solo para aclarar, el \ escapa caracteres especiales en expresiones regulares, como el. en este caso – realgt

+0

parece sed ... de alguna manera ... :) – Paschalis

+0

en expresión reagukar el punto. significa todo, ¡esta es la solución correcta! –

294

Uno más solución que es fácil de entender :)

var newstring = mystring.split('.').join(' '); 
+23

@HaggleLad porque no necesita meterse con la expresión regular –

+5

¿No es esto mucho más lento que la eliminación de gel? –

+1

@Jasper según entiendo, en realidad es más rápido en la mayoría de los navegadores, aunque en realidad no lo he comparado. – andrew

53
/** 
* ReplaceAll by Fagner Brack (MIT Licensed) 
* Replaces all occurrences of a substring in a string 
*/ 
String.prototype.replaceAll = function(token, newToken, ignoreCase) { 
    var _token; 
    var str = this + ""; 
    var i = -1; 

    if (typeof token === "string") { 

     if (ignoreCase) { 

      _token = token.toLowerCase(); 

      while((
       i = str.toLowerCase().indexOf(
        _token, i >= 0 ? i + newToken.length : 0 
       )) !== -1 
      ) { 
       str = str.substring(0, i) + 
        newToken + 
        str.substring(i + token.length); 
      } 

     } else { 
      return this.split(token).join(newToken); 
     } 

    } 
return str; 
}; 

alert('okay.this.is.a.string'.replaceAll('.', ' ')); 

más rápido que usar expresiones regulares ...

EDIT:
Tal vez en el momento en que hice este código no usé jsperf. Pero al final, tal discusión es totalmente inútil, la diferencia de rendimiento no vale la legibilidad del código en el mundo real, por lo que mi respuesta sigue siendo válida, incluso si el rendimiento difiere del enfoque de expresión regular.

Edit2:
He creado una librería que le permite hacer esto utilizando una interfaz fluida:

replace('.').from('okay.this.is.a.string').with(' '); 

Ver https://github.com/FagnerMartinsBrack/str-replace.

+1

Muy útil. FYI: Hay caracteres deshonestos después del punto y coma en la declaración de alerta. – Patrick

+0

¿Qué quiere decir con "personaje pícaro"? –

+1

Se refiere a la entidad & # 8203; dos veces, que es el carácter Unicode 'ZERO WIDTH SPACE' (U + 200B). Más información en http://www.fileformat.info/info/unicode/char/200b/index.htm –

22
str.replace(new RegExp(".","gm")," ") 
+1

Funcionó muy bien para reemplazar la función =) – afreeland

6

Agrego doble barra invertida al punto para que funcione. Animar.

var st = "okay.this.is.a.string"; 
var Re = new RegExp("\\.","g"); 
st = st.replace(Re," "); 
alert(st); 
2
String.prototype.replaceAll = function(character,replaceChar){ 
    var word = this.valueOf(); 

    while(word.indexOf(character) != -1) 
     word = word.replace(character,replaceChar); 

    return word; 
} 
+3

¿no se quedará atascado en un bucle infinito si le das algo como: 'replaceAll ('&', '&')'? (admitidamente eso no es un caso en la pregunta del OP) – Anentropic

+0

Pero "&" contiene un '&' para que el bucle nunca se quede sin cosas que reemplazar (y la cadena sigue creciendo). Lo intenté hace un momento y bloqueó mi navegador ... – Anentropic

2

Aquí es otra implementación de replaceAll. Espero que ayude a alguien.

String.prototype.replaceAll = function (stringToFind, stringToReplace) { 
     if (stringToFind === stringToReplace) return this; 
     var temp = this; 
     var index = temp.indexOf(stringToFind); 
     while (index != -1) { 
      temp = temp.replace(stringToFind, stringToReplace); 
      index = temp.indexOf(stringToFind); 
     } 
     return temp; 
    }; 

A continuación, puede usarlo:

var myText = "mi nombre es George";
var newText = myText.replaceAll ("George", "Michael");

+1

Esto no maneja la búsqueda/reemplazo insensible a mayúsculas/minúsculas. Por lo tanto, es funcionalmente equivalente a: 'string.split (stringToFind) .join (stringToReplace)' – sstur

4

Esto es más concisa/legible y debería funcionar mejor que la publicada por Fagner Brack (toLowerCase no se realiza en bucle):

String.prototype.replaceAll = function(search, replace, ignoreCase) { 
    if (ignoreCase) { 
    var result = []; 
    var _string = this.toLowerCase(); 
    var _search = search.toLowerCase(); 
    var start = 0, match, length = _search.length; 
    while ((match = _string.indexOf(_search, start)) >= 0) { 
     result.push(this.slice(start, match)); 
     start = match + length; 
    } 
    result.push(this.slice(start)); 
    } else { 
    result = this.split(search); 
    } 
    return result.join(replace); 
} 

Uso:

alert('Bananas And Bran'.replaceAll('An', '(an)')); 
+1

En realidad, parece que escapado RegEx funciona mejor que indexOf! No suena bien, pero JSPerf indica que es mucho más rápido: http://jsperf.com/replaceall-indexof-vs-regex – sstur

+0

Tal vez en el momento en que hice ese código no utilicé jsperf. Pero al final, tal discusión es totalmente inútil, la diferencia de rendimiento no vale la legibilidad del código en el mundo real, por lo que mi respuesta sigue siendo válida. –

-5
var mystring = 'okay.this.is.a.string'; 
var myNewString = escapeHtml(mystring); 

function escapeHtml(text) { 
if('' !== text) { 
    return text.replace(/&/g, "&") 
       .replace(/&lt;/g, "<") 
       .replace(/&gt;/g, ">") 
       .replace(/\./g,' ') 
       .replace(/&quot;/g, '"') 
       .replace(/&#39/g, "'"); 
} 
+0

Para escapar de HTML, use 'createTextNode' – Downgoat

12

Por esta escenario simple, también recomendaría usar los métodos que vienen incorporados en javascript.

Usted podría intentar esto:

"okay.this.is.a.string".split(".").join("") 

Saludos

0

Ejemplo: quiero reemplazar todas dobles comillas (") en la comilla simple (') A continuación, el código será así

var str= "\"Hello\"" 
var regex = new RegExp('"', 'g'); 
str = str.replace(regex, '\''); 
console.log(str); // 'Hello' 
-1

puede reemplazar todas las ocurrencias de cualquier cadena/carácter utilizando el objeto RegExp javasscript.

Aquí está el código,

var mystring = 'okay.this.is.a.string'; 

var patt = new RegExp("\\."); 

while(patt.test(mystring)){ 

    mystring = mystring .replace(".",""); 

} 
0

@ de Scripto hizo un poco más concisa y sin prototype:

function strReplaceAll(s, stringToFind, stringToReplace) { 
    if (stringToFind === stringToReplace) return s; 
    for (let index = s.indexOf(stringToFind); index != -1; index = s.indexOf(stringToFind)) 
     s = s.replace(stringToFind, stringToReplace); 
    return s; 
} 

He aquí cómo esta se acumula: Respuesta http://jsperf.com/replace-vs-split-join-vs-replaceall/68

0
String.prototype.replaceAll = function (needle, replacement) { 
    return this.replace(new RegExp(needle, 'g'), replacement); 
}; 
Cuestiones relacionadas