Reemplazar múltiples espacios en blanco con un espacio en blanco en una cadena de JavaScript

191

Tengo cadenas con espacios en blanco adicionales, cada vez que hay más de un espacio en blanco me gustaría que fuera solo uno.

¿Nadie? Intenté buscar en google, pero nada funcionó para mí.

Gracias

víspera
fuente
2
eliminar espacios en blanco duplicados desde el final / principio, o en cualquier parte del texto?
ninjagecko
Posible duplicado de Regex para reemplazar múltiples espacios con un solo espacio
Muhammad Omar ElShourbagy

Respuestas:

371

Algo como esto:

var s = "  a  b     c  ";

console.log(
  s.replace(/\s+/g, ' ')
)

bjornd
fuente
31
@Me Lea la pregunta detenidamente: "cada vez que hay más de un espacio en blanco me gustaría que fuera solo uno".
bjornd
55
¿No es obvio? reemplaza más de 1 carácter de espacio en blanco con 1 carácter de espacio en blanco. (el resultado deseado)
Guerra
44
@CiaranG Es una expresión regular
pomeroy
1
@Wardy, cierre :-). Reemplaza uno O más con un espacio (pero de hecho, el resultado deseado).
greenoldman
1
¿Qué pasa si uno quiere reemplazar 1+ espacios en blanco con el mismo tipo de espacio en blanco? (p. ej., 2+ espacios con un espacio y 3 líneas nuevas con una línea nueva, etc.) si hay líneas nuevas y espacios, debería ser reemplazado por una línea nueva, mientras que si hay espacios y pestañas, debería ser reemplazado por un espacio
Tom
61

Puede aumentar String para implementar estos comportamientos como métodos, como en:

String.prototype.killWhiteSpace = function() {
    return this.replace(/\s/g, '');
};

String.prototype.reduceWhiteSpace = function() {
    return this.replace(/\s+/g, ' ');
};

Esto ahora le permite utilizar las siguientes formas elegantes para producir las cadenas que desee:

"Get rid of my whitespaces.".killWhiteSpace();
"Get rid of my extra        whitespaces".reduceWhiteSpace();
gui pn
fuente
14
El aumento del prototipo del objeto estándar es un patrón realmente controvertido. No lo recomendaría para una pregunta tan básica.
Miércoles
@XavierJohn Es String, con una R, no Sting.
LasagnaAndroid
20

El uso de una expresión regular con la función de reemplazo hace el truco:

string.replace(/\s/g, "")
Roger Gajraj
fuente
Esta solución es incorrecta según la pregunta. Y realmente me pregunto por qué lo publicaste dos días después de que se haya publicado una solución mejor ...
Sebastian Mach
Creo que en ese momento, solo este código funcionó para mí. No puedo volver sobre eso para confirmar. Obviamente, habría intentado la mejor solución primero. Además, al comprobarlo en la consola de Chrome, ambas soluciones parecían funcionar. Curiosamente, sin embargo, cuando copié el resultado en este cuadro de comentarios, mostró que mi solución no funcionaba para múltiples espacios en blanco. Quizás puedas ayudarme a entender por qué. ¿Supongo que es un error de Chrome? Intenta ejecutar mi código en la consola de Chrome y avísame.
Roger Gajraj
13

Aquí hay una solución no regex (solo por diversión):

var s = ' a   b   word word. word, wordword word   ';

// with ES5:
s = s.split(' ').filter(function(n){ return n != '' }).join(' ');
console.log(s); // "a b word word. word, wordword word"

// or ES6:
s = s.split(' ').filter(n => n).join(' '); 
console.log(s); // "a b word word. word, wordword word"

Divide la cadena en espacios en blanco , elimina todos los elementos de la matriz vacíos de la matriz (los que tenían más de un solo espacio) y une todas las palabras nuevamente en una cadena, con un solo espacio en blanco entre ellas.

vsync
fuente
12

Supongo que está buscando eliminar espacios desde el principio y / o el final de la cadena (en lugar de eliminar todos los espacios?

Si ese es el caso, necesitará una expresión regular como esta:

mystring = mystring.replace(/(^\s+|\s+$)/g,' ');

Esto eliminará todos los espacios desde el principio o el final de la cadena. Si solo desea recortar espacios desde el final, la expresión regular se vería así:

mystring = mystring.replace(/\s+$/g,' ');

Espero que ayude.

Spudley
fuente
44
Me gusta la simplicidad de su expresión regular, @Spudley, pero ¿su código no reemplazará las ejecuciones de espacios en blanco al principio y al final con un solo carácter de espacio? Pensé que el objetivo era eliminar el espacio en blanco de los extremos por completo, en cuyo caso la cadena de reemplazo debería ser en ''lugar de ' '.
Randall Cook
8

jQuery.trim () funciona bien.

http://api.jquery.com/jQuery.trim/

chug2k
fuente
14
Solo recuerda que esto no elimina todos los espacios en blanco. Citando los documentos: "Eliminar el espacio en blanco desde el principio y el final de una cadena ".
Jonik
6

Sé que no debería tener nigromancia en un tema, pero dados los detalles de la pregunta, generalmente lo amplío para que signifique:

  • Quiero reemplazar múltiples ocurrencias de espacios en blanco dentro de la cadena con un solo espacio
  • ... y ... no quiero espacios en blanco al principio o al final de la cadena (recorte)

Para esto, uso un código como este (el paréntesis en la primera expresión regular está ahí solo para hacer que el código sea un poco más legible ... las expresiones regulares pueden ser un dolor a menos que esté familiarizado con ellas):

s = s.replace(/^(\s*)|(\s*)$/g, '').replace(/\s+/g, ' ');

La razón por la que esto funciona es que los métodos en String-object devuelven un objeto de cadena en el que puede invocar otro método (al igual que jQuery y algunas otras bibliotecas). Una forma mucho más compacta de codificar si desea ejecutar varios métodos en un solo objeto en sucesión.

Markku Uttula
fuente
+1 para el ejemplo de "listo para usar". Iba a publicarlo yo mismo
d.raev
EXACTAMENTE lo que estaba buscando, ¡increíble!
robertp
4

var x = "Prueba Prueba Prueba" .split ("") .join (""); alerta (x);

Praveen Kumar Thalluri
fuente
55
Funciona pero no es una codificación inteligente. Este código es más lento que un RegEx. ¡Me pregunto si Split () no usa RegEx para dividir una cadena!
Farandole
2

Prueba esto.

var string = "         string             1";
string = string.trim().replace(/\s+/g, ' ');

el resultado será

string 1

Lo que sucedió aquí es que primero recortará los espacios exteriores usando y trim()luego recortará los espacios interiores usando .replace(/\s+/g, ' ').

Richard Vergis
fuente
0

Si desea restringir al usuario para que dé espacio en blanco en el nombre, simplemente cree una instrucción if y proporcione la condición. como yo lo hice:

$j('#fragment_key').bind({
    keypress: function(e){
        var key = e.keyCode;
    var character = String.fromCharCode(key); 
    if(character.match( /[' ']/)) {
        alert("Blank space is not allowed in the Name");
        return false;
        }
    }
});
  • crear una función JQuery.
  • Este es un evento de prensa clave.
  • Inicializar una variable.
  • Dar condición para que coincida con el personaje
  • muestra un mensaje de alerta para su condición coincidente.
Abhijit BIswas
fuente
0

¿Que tal este?

"my test string \t\t with crazy stuff is cool ".replace(/\s{2,9999}|\t/g, ' ')

salidas "my test string with crazy stuff is cool "

Este también elimina las pestañas

usuario3413723
fuente
Las pestañas ya están cubiertas por \s. Regex innecesariamente complejo, bien podría escribir /\s+/g.
Anders Rabo Thorbeck