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


2
Doppelte Leerzeichen vom Ende / Anfang oder irgendwo im Text entfernen?
Ninjagecko

Antworten:


371

Etwas wie das:

var s = "  a  b     c  ";

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


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();

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, "")

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.


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.


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


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.


+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);


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, ' ').


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.

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


Tabs werden bereits von abgedeckt \s. Unnötig komplexer Regex, könnte genauso gut einfach schreiben /\s+/g.
Anders Rabo Thorbeck
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.