Jak wykryć ciąg zawierający tylko spacje?

83

Długość łańcucha zawierającego jedną spację jest zawsze równa 1:

alert('My str length: ' + str.length);

Przestrzeń to znak, więc:

str = "   ";
alert('My str length:' + str.length); // My str length: 3

Jak odróżnić pusty ciąg od ciągu zawierającego tylko spacje? Jak mogę wykryć ciąg zawierający tylko spacje?

Luca
źródło
1
Przytnij go i sprawdź, czy długość wynosi zero. Czy używasz jQuery?
Chetter Hummin
2
Usuń wszystkie spacje i sprawdź, czy długość ciągu to 0? Lub użyj wyrażenia regularnego, aby dopasować tylko białe znaki ...
Felix Kling

Odpowiedzi:

154

Aby to osiągnąć, możesz użyć wyrażenia regularnego, aby usunąć wszystkie białe znaki z ciągu. Jeśli długość otrzymanego ciągu to 0, możesz być pewien, że oryginał zawierał tylko spacje. Spróbuj tego:

var str = "    ";
if (!str.replace(/\s/g, '').length) {
  console.log('string only contains whitespace (ie. spaces, tabs or line breaks)');
}

Rory McCrossan
źródło
1
Cóż, ciąg zawierał tylko białe znaki.
dwerner
50

Najszybszym rozwiązaniem byłoby użycie funkcji prototypu wyrażenia regularnego regex test () i wyszukanie dowolnego znaku, który nie jest spacją ani podziałem wiersza \S:

if (/\S/.test(str))
{
    // found something other than a space or line break
}

Jeśli masz bardzo długi sznurek, może to mieć znaczący wpływ.

pmrotule
źródło
15

Podobnie jak w przypadku odpowiedzi Rory'ego, dzięki ECMA 5 możesz teraz po prostu zadzwonić str.trim().lengthzamiast używać wyrażenia regularnego. Jeśli wynikowa wartość to 0, wiesz, że masz ciąg zawierający tylko spacje.

if (!str.trim().length) {
  console.log('str is empty!');
}

Możesz przeczytać więcej o wykończeniu tutaj .

bobbyg603
źródło
2
Najbardziej podoba mi się ta odpowiedź. Bardzo zgrabny. 👍
GTS Joe
3
To najbardziej eleganckie rozwiązanie.
Gefilte Fish
11
if(!str.trim()){
  console.log('string is empty or only contains spaces');
}

Usunięcie białych znaków z łańcucha można wykonać za pomocą String#trim().

Aby sprawdzić, czy ciąg jest pusty, czy nieokreślony, można sprawdzić, czy sam łańcuch jest błędny, w takim przypadku jest to pusty, niezdefiniowany lub pusty. To pierwsze sprawdzenie jest konieczne, ponieważ próba wywołania metod na nulllub undefinedspowoduje błąd. Aby sprawdzić, czy zawiera tylko spacje, można sprawdzić, czy po przycięciu ciąg jest uszkodzony, co oznacza, że ​​jest w tym miejscu pusty.

if(!str || !str.trim()){
   //str is null, undefined, or contains only spaces
}

Można to uprościć za pomocą opcjonalnego operatora łańcuchowego .

if(!str?.trim()){
   //str is null, undefined, or contains only spaces
}

Jeśli masz pewność, że zmienna będzie ciągiem znaków, konieczne jest tylko drugie sprawdzenie.

if(!str.trim()){
   console.log("str is empty or contains only spaces");
}
odrobina
źródło
8

Możesz przyciąć wartość ciągu, tworząc funkcję przycinania dla swoich ciągów znaków.

String.prototype.trim = function () {
    return this.replace(/^\s*/, "").replace(/\s*$/, "");
}

teraz będzie dostępny dla każdego twojego Stringa i możesz go używać jako

str.trim().length// Result will be 0

Możesz również użyć tej metody, aby usunąć spacje na początku i na końcu ciągu, tj

"  hello  ".trim(); // Result will be "hello"
Shehzad
źródło
4
Rozszerzanie prototypów obiektów wbudowanych to zły pomysł.
sbichenko
@exizt: a co, jeśli będzie używany tylko przez jego własny kod?
Shehzad
0

Przytnij wartość ciągu, tworząc funkcję przycinania

var text = "  ";
if($.trim(text.length == 0){
  console.log("Text is empty");
}
else
{
  console.log("Text is not empty");
}
user3024615
źródło