Remplacer plusieurs espaces par un seul espace dans la chaîne JavaScript


191

J'ai des chaînes avec des espaces supplémentaires, chaque fois qu'il y a plus d'un seul espace, j'aimerais que ce soit un seul.

N'importe qui? J'ai essayé de chercher sur Google, mais rien n'a fonctionné pour moi.

Merci


2
supprimer les espaces en double de la fin / du début, ou n'importe où dans le texte?
ninjagecko

Réponses:


371

Quelque chose comme ça:

var s = "  a  b     c  ";

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


31
@Me Veuillez lire attentivement la question: "chaque fois qu'il y a plus d'un seul espace, j'aimerais qu'il en soit un seul".
bjornd

5
N'est-ce pas évident? il remplace plus de 1 caractère d'espacement par 1 caractère d'espacement. (le résultat souhaité)
War

4
@CiaranG C'est une expression régulière
pomeroy

1
@Wardy, fermez :-). Il remplace un OU plusieurs par un espace (mais en effet, le résultat souhaité).
greenoldman

1
Et si l'on veut remplacer 1+ espaces blancs par le même type d'espaces blancs? (par exemple 2+ espaces avec un espace et 3 retours à la ligne avec une nouvelle ligne, etc.) s'il y a à la fois des retours à la ligne et des espaces, il devrait être remplacé par une nouvelle ligne alors que s'il y a à la fois des espaces et des tabulations, il devrait être remplacé par un space
Tom

61

Vous pouvez augmenter String pour implémenter ces comportements en tant que méthodes, comme dans:

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

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

Cela vous permet désormais d'utiliser les formes élégantes suivantes pour produire les chaînes souhaitées:

"Get rid of my whitespaces.".killWhiteSpace();
"Get rid of my extra        whitespaces".reduceWhiteSpace();

14
L'augmentation du prototype de l'objet standard est un modèle vraiment controversé. Je ne le recommanderais pas pour une question aussi fondamentale.
bjornd

@XavierJohn C'est String, avec un R, pas Sting.
LasagnaAndroid

20

l'utilisation d'une expression régulière avec la fonction replace fait l'affaire:

string.replace(/\s/g, "")

Cette solution est fausse par rapport à la question. Et je me demande vraiment pourquoi vous l'avez posté deux jours après la publication d'une meilleure solution ...
Sebastian Mach

Je pense qu'à l'époque, seul ce code fonctionnait pour moi. Je ne peux pas revenir là-dessus pour confirmer. J'aurais évidemment essayé la meilleure solution en premier. De plus, après l'avoir vérifié dans la console Chrome, les deux solutions semblaient fonctionner. Fait intéressant cependant, lorsque j'ai copié le résultat dans cette zone de commentaire, cela a montré que ma solution ne fonctionnait pas pour plusieurs espaces. Peut-être pouvez-vous m'aider à comprendre pourquoi. Je suppose que c'est une erreur de chrome? Essayez d'exécuter mon code dans la console Chrome et faites-le moi savoir.
Roger Gajraj

13

Voici une solution non-regex (juste pour le plaisir):

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"

Il divise la chaîne par des espaces , les supprime tous les éléments de tableau vides du tableau (ceux qui étaient plus d'un seul espace), et joint à nouveau tous les mots dans une chaîne, avec un seul espace entre eux.


12

Je suppose que vous cherchez à supprimer les espaces du début et / ou de la fin de la chaîne (plutôt que de supprimer tous les espaces?

Si tel est le cas, vous aurez besoin d'une expression régulière comme celle-ci:

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

Cela supprimera tous les espaces du début ou de la fin de la chaîne. Si vous voulez seulement couper les espaces à partir de la fin, alors l'expression régulière ressemblerait à ceci à la place:

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

J'espère que cela pourra aider.


4
J'aime la simplicité de votre regex, @Spudley, mais votre code ne remplacera-t-il pas des espaces au début et à la fin par un seul caractère d'espace? Je pensais que le but était de supprimer entièrement l'espace blanc des extrémités, auquel cas la chaîne de remplacement devrait être à la ''place de ' '.
Randall Cook


6

Je sais que je ne devrais pas nécromancie sur un sujet, mais étant donné les détails de la question, je l'élargis généralement pour signifier:

  • Je souhaite remplacer plusieurs occurrences d'espaces blancs à l'intérieur de la chaîne par un seul espace
  • ... et ... je ne veux pas d'espaces blancs au début ou à la fin de la chaîne (trim)

Pour cela, j'utilise un code comme celui-ci (les parenthèses sur la première expression régulière sont là juste pour rendre le code un peu plus lisible ... les expressions régulières peuvent être pénibles à moins que vous ne les connaissiez):

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

La raison pour laquelle cela fonctionne est que les méthodes sur String-object renvoient un objet string sur lequel vous pouvez invoquer une autre méthode (tout comme jQuery et certaines autres bibliothèques). Manière beaucoup plus compacte de coder si vous souhaitez exécuter plusieurs méthodes successivement sur un seul objet.


+1 pour l'exemple "prêt à l'emploi" .. J'allais le poster moi-même
d.raev

EXACTEMENT ce que je cherchais, génial!
robertp

4

var x = "Test Test Test" .split ("") .join (""); alerte (x);


5
Cela fonctionne mais ce n'est pas un codage intelligent. Ce code est plus lent qu'un RegEx. Je me demande si Split () n'utilise pas RegEx pour diviser une chaîne!
Farandole

2

Essaye ça.

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

le résultat sera

string 1

Ce qui s'est passé ici, c'est qu'il coupera d'abord les espaces extérieurs en utilisant, trim()puis les espaces intérieurs en utilisant .replace(/\s+/g, ' ').


0

Si vous souhaitez restreindre l'utilisateur à donner un espace vide dans le nom, créez simplement une instruction if et indiquez la condition. comme j'ai fait:

$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;
        }
    }
});
  • créer une fonction JQuery.
  • il s'agit d'un événement de presse clé.
  • Initialisez une variable.
  • Donner une condition pour correspondre au caractère
  • afficher un message d'alerte pour votre condition correspondante.

0

Celui-ci, ça va?

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

les sorties "my test string with crazy stuff is cool "

Celui-ci supprime également tous les onglets


Les onglets sont déjà couverts par \s. Une regex inutilement complexe, pourrait tout aussi bien écrire /\s+/g.
Anders Rabo Thorbeck le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.