Wie teile ich eine Zeichenfolge nach Leerzeichen und ignoriere führende und nachfolgende Leerzeichen mithilfe eines regulären Ausdrucks in ein Array von Wörtern?

76

Normalerweise verwende ich den folgenden Code in JavaScript, um eine Zeichenfolge nach Leerzeichen aufzuteilen.

"The quick brown fox jumps over the lazy dog.".split(/\s+/);
// ["The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog."]

Dies funktioniert natürlich auch dann, wenn zwischen den Wörtern mehrere Leerzeichen stehen.

"The  quick brown fox     jumps over the lazy   dog.".split(/\s+/);
// ["The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog."]

Das Problem ist, wenn ich eine Zeichenfolge mit führenden oder nachfolgenden Leerzeichen habe. In diesem Fall enthält das resultierende Array von Zeichenfolgen ein leeres Zeichen am Anfang und / oder Ende des Arrays.

"  The quick brown fox jumps over the lazy dog. ".split(/\s+/);
// ["", "The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog.", ""]

Es ist eine triviale Aufgabe, solche leeren Zeichen zu entfernen, aber ich würde mich lieber im regulären Ausdruck darum kümmern, wenn dies überhaupt möglich ist. Weiß jemand, welchen regulären Ausdruck ich verwenden könnte, um dieses Ziel zu erreichen?

natlee75
quelle
Pferde für Kurse. splitwird verwendet, um einen String zu teilen , nicht um ihn zu mutieren . Sehen Sie, wie man einen String in JavaScript schneidet? .
DCoder
Leider unterstützt Javascript Lookbehind nicht und selbst wenn Sie Lookbehind verwendet hätten , wäre in der ersten Teilung Platz
Anirudha
Ich habe aus dieser Perspektive nie daran gedacht. Vielen Dank für den Hinweis!
Natlee75
Kannst du vor dem Split kein Trim () machen?
Jacques Koorts

Antworten:

119

Wenn Sie mehr an Bits interessiert sind, die keine Leerzeichen sind, können Sie die Nicht-Leerzeichen abgleichen, anstatt sie auf Leerzeichen aufzuteilen.

"  The quick brown fox jumps over the lazy dog. ".match(/\S+/g);

Beachten Sie, dass Folgendes zurückgegeben wird null:

"   ".match(/\S+/g)

Das beste Muster zum Lernen ist also:

str.match(/\S+/g) || []
kennebec
quelle
9
Achtung, ' '.match(/\S+/g)kehrt nullstatt []!
Andy
Ich frage mich, wessen Lösung bei Ihnen oder bei @Josh schneller ist (wenn wir den Fall [""] behandeln).
Ibodi
49

" The quick brown fox jumps over the lazy dog. ".trim().split(/\s+/);

Josh
quelle
3
Danke für den Vorschlag. Ich wollte diesen Weg tatsächlich gehen, bis ich mich daran erinnerte, dass ein Browser erforderlich ist, der JavaScript 1.8 unterstützt. Für die meisten unserer Benutzer ist das in Ordnung, aber wir unterstützen weiterhin ältere Browser wie Internet Explorer 7 und 8, deren JavaScript-Engines diese Funktionalität nicht enthalten.
Natlee75
9
Achtung, ' '.trim().split(/\s+/)kehrt zurück [""]!
Andy
Ich frage mich, wessen Lösung schneller ist (wenn wir den Fall [""] behandeln) oder @kennebecs
ibodi
16

Anstatt bei Leerzeichenfolgen zu teilen, können Sie auch Nicht-Leerzeichenfolgen zuordnen:

"  The quick brown fox jumps over the lazy dog. ".match(/\S+/g)
Gumbo
quelle
0

Nicht elegant wie andere Codes, aber sehr einfach zu verstehen:

    countWords(valOf)
    {
        newArr[];
        let str = valOf;
        let arr = str.split(" ");

        for (let index = 0; index < arr.length; index++) 
       {
           const element = arr[index];
           if(element)
           {
              newArr.push(element);
           }
       }
       const NumberOfWords = newArr.length;

       return NumberOfWords;
   }
aris
quelle