web-dev-qa-db-fra.com

Regex pour remplacer plusieurs espaces par un seul espace

Étant donné une chaîne comme: 

"Le chien a une longue queue et il est ROUGE!"

Quel type de magie jQuery ou JavaScript peut être utilisé pour conserver des espaces sur un seul espace maximum?

Objectif: 

"Le chien a une longue queue et il est ROUGE!"
363
AnApprentice

Étant donné que vous souhaitez également couvrir les onglets, les nouvelles lignes, etc., remplacez simplement \s\s+ par ' '

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

Si vous voulez vraiment couvrir uniquement les espaces (et donc pas les onglets, les nouvelles lignes, etc.), faites-le:

string = string.replace(/  +/g, ' ');
705
BalusC

Puisque vous semblez être intéressé par la performance, je les ai profilés avec Firebug. Voici les résultats que j'ai obtenus:

str.replace( /  +/g, ' ' )       ->  380ms
str.replace( /\s\s+/g, ' ' )     ->  390ms
str.replace( / {2,}/g, ' ' )     ->  470ms
str.replace( / +/g, ' ' )        ->  790ms
str.replace( / +(?= )/g, ' ')    -> 3250ms

Ceci est sur Firefox, en cours d'exécution 100k remplacement de chaîne.

Je vous encourage à faire vos propres tests de profilage avec firebug, si vous pensez que les performances sont un problème. Les humains sont notoirement mal à même de prédire où se situent les goulots d'étranglement dans leurs programmes.

(Notez également que la barre d'outils de développement de IE 8 dispose également d'un profileur intégré. Il peut être intéressant de vérifier l'état des performances dans IE.) 

137
Edward Loper
var str = "The      dog        has a long tail,      and it is RED!";
str = str.replace(/ {2,}/g,' ');

EDIT: Si vous souhaitez remplacer tout type de caractère d'espacement, la méthode la plus efficace serait la suivante:

str = str.replace(/\s{2,}/g,' ');
38
watain

Ceci est une solution, bien que cela cible tous les espaces:

"The      dog        has a long tail,      and it is RED!".replace(/\s\s+/g, ' ')

"The dog has a long tail, and it is RED!"

Edit : C'est probablement mieux car il cible un espace suivi d'un ou plusieurs espaces:

"The      dog        has a long tail,      and it is RED!".replace(/  +/g, ' ')

"The dog has a long tail, and it is RED!"

Méthode alternative:

"The      dog        has a long tail,      and it is RED!".replace(/ {2,}/g, ' ')
"The dog has a long tail, and it is RED!"

Je n'ai pas utilisé /\s+/ seul, car il remplace les espaces de 1 caractère plusieurs fois et risque d'être moins efficace puisqu'il cible plus que nécessaire.

Je n'ai pas testé profondément aucun de ceux-ci alors lmk s'il y a des bugs.

En outre, si vous envisagez de remplacer des chaînes, n'oubliez pas de réaffecter la variable/propriété à son propre remplacement, par exemple:

var string = 'foo'
string = string.replace('foo', '')

Utilisation de jQuery.prototype.text:

var el = $('span:eq(0)');
el.text( el.text().replace(/\d+/, '') )
16
meder omuraliev

J'ai cette méthode, je l'appelle la méthode Derp, faute d'un meilleur nom.

while (str.indexOf("  ") !== -1) {
    str = str.replace(/  /g, " ");
}

L'exécuter dans JSPerf donne des résultats surprenants.

13
Nenotlep

Plus robuste:

fonction trim (Word) 
 {
 Word = Word.replace (/ [^\x21-\x7E] +/g, ''); // change les caractères non imprimables en espaces 
 retourne Word.replace (/ ^\s + |\s + $/g, ''); // supprime les espaces de début/fin 
} 
9
Chris

Une méthode plus robuste: Cela prend en charge aussi en supprimant les espaces initial et final, s'ils existent. Par exemple:

// NOTE the possible initial and trailing spaces
var str = "  The dog      has a long   tail, and it     is RED!  "

str = str.replace(/^\s+|\s+$|\s+(?=\s)/g, "");

// str -> "The dog has a long tail, and it is RED !"

Votre exemple ne comportait pas ces espaces, mais ils constituent également un scénario très courant, et la réponse acceptée consistait uniquement à les réduire en espaces simples, par exemple: "Le ... ROUGE!", Ce qui n'est généralement pas nécessaire.

9
Ethan

Je suggère

string = string.replace(/ +/g," ");

pour juste des espaces 
OU

string = string.replace(/(\s)+/g,"$1");

pour transformer plusieurs déclarations en une seule déclaration également.

8
Leonard Meagher

Voici une solution alternative si vous ne souhaitez pas utiliser le remplacement (remplacer les espaces dans une chaîne sans utiliser le remplacement javascript)

var str="The dog      has a long   tail, and it     is RED!";
var rule=/\s{1,}/g;
str = str.split(rule).join(" "); 
document.write(str);
6
imos

Je sais que je suis en retard à la fête, mais j'ai découvert une solution intéressante.

C'est ici:

var myStr = myStr.replace(/[ ][ ]*/g, ' ');
5
ToXic73

Réponse complète non chiffrée pour newbies et al.

C’est pour tous les nuls comme moi qui testent les scripts écrits par certains d’entre vous qui ne fonctionnent pas.

Les 3 exemples suivants sont les étapes que j'ai prises pour supprimer les caractères spéciaux ET les espaces supplémentaires sur les 3 sites Web suivants (qui fonctionnent parfaitement) {1. EtaVisa.com 2. EtaStatus.com 3. Tikun.com} alors je sais que cela fonctionne parfaitement.

Nous les avons enchaînés avec plus de 50 à la fois et sans problèmes.

// Ceci a supprimé les caractères spéciaux + 0-9 et ne permet que des lettres (majuscules et minuscules)

function NoDoublesPls1()
{
var str=document.getElementById("NoDoubles1");
var regex=/[^a-z]/gi;
str.value=str.value.replace(regex ,"");
}

// Ceci supprime les caractères spéciaux et autorise uniquement les lettres (majuscules et minuscules) et les espaces 0-9 ET

function NoDoublesPls2()
{
var str=document.getElementById("NoDoubles2");
var regex=/[^a-z 0-9]/gi;
str.value=str.value.replace(regex ,"");
}

// Ceci supprime les caractères spéciaux et autorise uniquement les lettres (majuscules et minuscules) et 0-9 ET les espaces// quand j’utilisais des guillemets simples, cela ne fonctionnait pas.

function NoDoublesPls3()
{    var str=document.getElementById("NoDoubles3");
var regex=/[^a-z 0-9]/gi;
str.value=str.value.replace(regex ,"") .replace(/\s\s+/g, " ");
}

:: NEXT :: Enregistrer # 3 sous a .js // J'ai appelé le mien NoDoubles.js

:: NEXT :: Incluez votre JS dans votre page

 <script language="JavaScript" src="js/NoDoubles.js"></script>

Incluez ceci dans votre champ de formulaire :: tel que 

<INPUT type="text" name="Name"
     onKeyUp="NoDoublesPls3()" onKeyDown="NoDoublesPls3()" id="NoDoubles3"/>

Alors ça ressemble à ça

<INPUT type="text" name="Name" onKeyUp="NoDoublesPls3()" onKeyDown="NoDoublesPls3()" id="NoDoubles3"/>

Cela supprimera les caractères spéciaux, autorisera les espaces simples et supprimera les espaces supplémentaires.

5
PatFoster

Aussi une possibilité:

str.replace( /\s+/g, ' ' )
4
rfunduk

Jquery a la fonction trim () qui transforme fondamentalement quelque chose comme ceci "FOo Bar" en "FOo Bar".

var string = "  My     String with  Multiple lines    ";
string.trim(); // output "My String with Multiple lines"

Il est beaucoup plus utile car il supprime automatiquement les espaces vides au début et à la fin de la chaîne. Pas de regex nécessaire.

2
Eryk Wróbel

Nous pouvons utiliser la regex suivante expliquée à l'aide de la commande sed system. Le regex similaire peut être utilisé dans d'autres langages et plateformes.

Ajouter le texte dans un fichier dit test

manjeet-laptop:Desktop manjeet$ cat test
"The dog      has a long   tail, and it     is RED!"

Nous pouvons utiliser la regex suivante pour remplacer tous les espaces blancs par un seul espace

manjeet-laptop:Desktop manjeet$ sed 's/ \{1,\}/ /g' test
"The dog has a long tail, and it is RED!"

J'espère que cela sert le but

0
minhas23

is replace n'est pas utilisé, string = string.split (/\W + /);

0
Lin

Essayez ceci pour remplacer plusieurs espaces par un seul.

<script type="text/javascript">
    var myStr = "The dog      has a long   tail, and it     is RED!";
    alert(myStr);  // Output 'The dog      has a long   tail, and it     is RED!'

    var newStr = myStr.replace(/  +/g, ' ');
    alert(newStr);  // Output 'The dog has a long tail, and it is RED!'
</script>

Read more @ Remplacement de plusieurs espaces par un seul espace

0
jonathan klevin

Pour plus de contrôle, vous pouvez utiliser le rappel de remplacement pour gérer la valeur.

value = "tags:HUNT  tags:HUNT         tags:HUNT  tags:HUNT"
value.replace(new RegExp(`(?:\\s+)(?:tags)`, 'g'), $1 => ` ${$1.trim()}`)
//"tags:HUNT tags:HUNT tags:HUNT tags:HUNT"
0
jackotonye
var text = `xxx  df dfvdfv  df    
                     dfv`.split(/[\s,\t,\r,\n]+/).filter(x=>x).join(' ');

résultat:

"xxx df dfvdfv df dfv"
0
Toolkit

Ce script supprime tout espace blanc (espaces multiples, tabulations, retours, etc.) entre les mots et les trims:

// Trims & replaces any wihtespacing to single space between words
String.prototype.clearExtraSpace = function(){
  var _trimLeft  = /^\s+/,
      _trimRight = /\s+$/,
      _multiple  = /\s+/g;

  return this.replace(_trimLeft, '').replace(_trimRight, '').replace(_multiple, ' ');
};
0
Oriol
var string = "The dog      has a long   tail, and it     is RED!";
var replaced = string.replace(/ +/g, " ");

Ou si vous souhaitez également remplacer les onglets:

var replaced = string.replace(/\s+/g, " ");
0
Brian Campbell
var myregexp = new RegExp(/ {2,}/g);

str = str.replace(myregexp,' ');
0
marvin