Ersetzen Sie mehrere Leerzeichen durch ein einzelnes Leerzeichen in der JavaScript-Zeichenfolge

191

Ich habe Zeichenfolgen mit zusätzlichen Leerzeichen. Jedes Mal, wenn es mehr als nur ein Leerzeichen gibt, möchte ich, dass es nur eines ist.

Jemand? Ich habe versucht, Google zu durchsuchen, aber nichts hat bei mir funktioniert.

Vielen Dank

Vorabend
quelle
2
Doppelte Leerzeichen vom Ende / Anfang oder irgendwo im Text entfernen?
Ninjagecko
Mögliches Duplikat von Regex, um mehrere Leerzeichen durch ein einzelnes Leerzeichen zu ersetzen
Muhammad Omar ElShourbagy

Antworten:

371

Etwas wie das:

var s = "  a  b     c  ";

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

bjornd
quelle
31
@Me Bitte lesen Sie die Frage sorgfältig durch: "Jedes Mal, wenn es mehr als nur ein Leerzeichen gibt, möchte ich, dass es nur eines ist".
bjornd
5
Ist es nicht offensichtlich? Es ersetzt mehr als 1 Leerzeichen durch 1 Leerzeichen. (das gewünschte Ergebnis)
Krieg
4
@CiaranG Es ist ein regelmäßiger Ausdruck
Pomeroy
1
@ Wardy, nah :-). Es ersetzt ein ODER mehrere durch ein Leerzeichen (aber tatsächlich das gewünschte Ergebnis).
Greenoldman
1
Was ist, wenn man 1+ Leerzeichen durch die gleiche Art von Leerzeichen ersetzen möchte? (z. B. 2+ Leerzeichen mit einem Leerzeichen und 3 Zeilenumbrüche mit einem Zeilenumbruch usw.) Wenn es sowohl Zeilenumbrüche als auch Leerzeichen gibt, müsste es durch ein Zeilenumbruch ersetzt werden, während es bei Leerzeichen und Tabulatoren durch a ersetzt werden müsste Raum
Tom
61

Sie können String erweitern, um diese Verhaltensweisen als Methoden zu implementieren, wie in:

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

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

Auf diese Weise können Sie jetzt die folgenden eleganten Formen verwenden, um die gewünschten Zeichenfolgen zu erstellen:

"Get rid of my whitespaces.".killWhiteSpace();
"Get rid of my extra        whitespaces".reduceWhiteSpace();
gui pn
quelle
14
Das Erweitern des Prototyps des Standardobjekts ist ein wirklich kontroverses Muster. Ich würde es für eine so grundlegende Frage nicht empfehlen.
bjornd
@ XavierJohn Es ist String, mit einem R, nicht Sting.
LasagneAndroid
20

Die Verwendung eines regulären Ausdrucks mit der Ersetzungsfunktion führt den Trick aus:

string.replace(/\s/g, "")
Roger Gajraj
quelle
Diese Lösung ist laut Frage falsch. Und ich frage mich wirklich, warum Sie es zwei Tage nach der
Sebastian Mach
Ich denke zu der Zeit hat nur dieser Code für mich funktioniert. Ich kann nicht darauf zurückkommen, um es zu bestätigen. Ich hätte natürlich zuerst die beste Lösung ausprobiert. Beim Einchecken in die Chrome-Konsole schienen beide Lösungen zu funktionieren. Interessanterweise zeigte sich jedoch beim Kopieren des Ergebnisses in dieses Kommentarfeld, dass meine Lösung für mehrere Leerzeichen nicht funktionierte. Vielleicht kannst du mir helfen zu verstehen warum. Ich denke, es ist ein Chromfehler? Versuchen Sie, meinen Code in der Chrome-Konsole auszuführen, und lassen Sie es mich wissen.
Roger Gajraj
13

Hier ist eine Nicht-Regex-Lösung (nur zum Spaß):

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"

Es teilt die Zeichenfolge durch Leerzeichen auf , entfernt alle leeren Array-Elemente aus dem Array (diejenigen, die mehr als ein einzelnes Leerzeichen waren) und fügt alle Wörter erneut zu einer Zeichenfolge mit einem einzelnen Leerzeichen dazwischen zusammen.

vsync
quelle
12

Ich nehme an, Sie möchten Leerzeichen vom Anfang und / oder Ende der Zeichenfolge entfernen (anstatt alle Leerzeichen zu entfernen ?

In diesem Fall benötigen Sie einen regulären Ausdruck wie folgt:

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

Dadurch werden alle Leerzeichen am Anfang oder Ende der Zeichenfolge entfernt. Wenn Sie nur Leerzeichen vom Ende abschneiden möchten, sieht der reguläre Ausdruck stattdessen folgendermaßen aus:

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

Hoffentlich hilft das.

Spudley
quelle
4
Ich mag die Einfachheit Ihres regulären Ausdrucks, @Spudley, aber wird Ihr Code nicht Leerzeichen am Anfang und Ende durch ein einzelnes Leerzeichen ersetzen? Ich dachte, das Ziel wäre es, das Leerzeichen vollständig von den Enden zu entfernen. In diesem Fall sollte die Ersatzzeichenfolge ''anstelle von sein ' '.
Randall Cook
8

jQuery.trim () funktioniert gut.

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

chug2k
quelle
14
Denken Sie daran, dass dadurch nicht alle Leerzeichen entfernt werden. Zitieren der Dokumente: "Entfernen Sie das Leerzeichen vom Anfang und Ende einer Zeichenfolge ."
Jonik
6

Ich weiß, dass ich zu einem Thema keine Nekromantie haben sollte, aber angesichts der Details der Frage erweitere ich sie normalerweise auf:

  • Ich möchte mehrere Vorkommen von Leerzeichen innerhalb der Zeichenfolge durch ein einzelnes Leerzeichen ersetzen
  • ... und ... Ich möchte keine Leerzeichen am Anfang oder Ende der Zeichenfolge (Trimm)

Dafür verwende ich Code wie diesen (die Klammern auf dem ersten regulären Ausdruck sind nur da, um den Code ein bisschen lesbarer zu machen ... reguläre Ausdrücke können schmerzhaft sein, wenn Sie nicht mit ihnen vertraut sind):

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

Der Grund dafür ist, dass die Methoden für das String-Objekt ein String-Objekt zurückgeben, für das Sie eine andere Methode aufrufen können (genau wie jQuery und einige andere Bibliotheken). Viel kompaktere Codierungsmethode, wenn Sie mehrere Methoden nacheinander für ein einzelnes Objekt ausführen möchten.

Markku Uttula
quelle
+1 für das Beispiel "gebrauchsfertig". Ich wollte es selbst
posten
Genau das, wonach ich gesucht habe, großartig!
Robertp
4

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

Praveen Kumar Thalluri
quelle
5
Es funktioniert, aber es ist keine intelligente Codierung. Dieser Code ist langsamer als ein RegEx. Ich frage mich, ob Split () RegEx nicht zum Teilen eines Strings verwendet!
Farandole
2

Versuche dies.

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

das Ergebnis wird sein

string 1

Was hier passiert ist, ist, dass es die Außenräume zuerst mit und trim()dann die Innenräume mit trimmt .replace(/\s+/g, ' ').

Richard Vergis
quelle
0

Wenn Sie den Benutzer einschränken möchten, Leerzeichen im Namen anzugeben, erstellen Sie einfach eine if-Anweisung und geben Sie die Bedingung an. wie ich es getan habe:

$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;
        }
    }
});
  • Erstellen Sie eine JQuery-Funktion.
  • Dies ist ein Tastendruckereignis.
  • Initialisieren Sie eine Variable.
  • Geben Sie eine Bedingung an, die dem Charakter entspricht
  • Zeigen Sie eine Warnmeldung für Ihren übereinstimmenden Zustand an.
Abhijit BIswas
quelle
0

Wie wäre es mit diesem?

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

Ausgänge "my test string with crazy stuff is cool "

Dieser wird auch alle Tabs los

user3413723
quelle
Tabs werden bereits von abgedeckt \s. Unnötig komplexer Regex, könnte genauso gut einfach schreiben /\s+/g.
Anders Rabo Thorbeck