Jak mogę sprawdzić, czy ciąg zawiera znaki i spacje, a nie tylko białe spacje?

140

Jaki jest najlepszy sposób sprawdzenia, czy ciąg zawiera tylko białe znaki?

Łańcuch może zawierać znaki połączone ze spacjami , ale nie tylko białe znaki.

patad
źródło

Odpowiedzi:

300

Zamiast sprawdzać cały ciąg, aby zobaczyć, czy jest tylko biała spacja, po prostu sprawdź, czy jest co najmniej jeden znak niebędący białą spacją:

if (/\S/.test(myString)) {
    // string is not empty and not just whitespace
}
nickf
źródło
7
Uważaj tylko, aby myString miało wartość null. Zwróci true: /\S/.test(null) == true
Dilshod Tadjibaev
6
wiele z tych odpowiedzi zawiera wyrażenia regularne! Czy to oznacza, że ​​nie ma natywnego sposobu wykrywania rzeczy w js? czy nie ma string.IsWhitespace czy coś? Czy nie ma też natywnego wykończenia?
JonnyRaa
5
@JonnyLeeds Ponieważ regex obsługuje nawet składnię w js, można powiedzieć, że jest bardziej natywny niż jakiekolwiek dostarczone metody narzędziowe;)
Ricardo van den Broek
44

Najprostsza odpowiedź, jeśli Twoja przeglądarka obsługuje tę trim()funkcję

if (myString && !myString.trim()) {
    //First condition to check if string is not empty
    //Second condition checks if string contains just whitespace
}
FullStack
źródło
W dzisiejszych czasach, gdy IE 8 jest RIP, jest to najczystsze i najbardziej wydajne rozwiązanie oparte na natywnej implementacji. I działa poprawnie z zakładkami i nowymi liniami.
Alexander Abakumov
35
if (/^\s+$/.test(myString))
{
      //string contains only whitespace
}

ten sprawdza 1 lub więcej białych znaków, jeśli ją również dopasować pusty ciąg następnie zastąpić +z *.

Paul Creasey
źródło
18

Cóż, jeśli używasz jQuery, jest to prostsze.

if ($.trim(val).length === 0){
   // string is invalid
} 
Dayson
źródło
1
Działa również dla nowej linii i tabulatora, podczas gdy powyższe przykłady wyrażeń regularnych nie, ponieważ szukają tylko braku czegokolwiek poza białymi znakami. Chociaż jestem pewien, że ktoś z pewną znajomością wyrażeń regularnych mógłby utworzyć wyrażenie regularne, które obejmowałoby również tabulację / nową linię w wyszukiwaniu.
Kate
nie działa, gdy val ma przypisane spacje, w moim przypadku cztery spacje.
user1451111
7

Po prostu porównaj ciąg z tym wyrażeniem regularnym:

if(mystring.match(/^\s+$/) === null) {
    alert("String is good");
} else {
    alert("String contains only whitespace");
}
Ian Clelland
źródło
1
Sposób, w jaki czytam to pytanie, mówi, że / dowolny / biały znak jest dozwolony, o ile łańcuch nie jest / tylko / biały znak. Nie mówi się, co zrobić, jeśli łańcuch jest pusty, więc może być tak, że odpowiedź nickfa jest jeszcze lepsza.
Ian Clelland
1
if (!myString.replace(/^\s+|\s+$/g,""))
  alert('string is only whitespace');
szczupły
źródło
0

Wyrażenie regularne, którego użyłem, gdy chcę zezwolić na spacje w środku ciągu, ale nie na początku ani na końcu, było takie:

[\S]+(\s[\S]+)*

lub

^[\S]+(\s[\S]+)*$

Więc wiem, że to stare pytanie, ale możesz zrobić coś takiego:

if (/^\s+$/.test(myString)) {
    //string contains characters and white spaces
}

lub możesz zrobić to, co powiedział nickf i użyć:

if (/\S/.test(myString)) {
    // string is not empty and not just whitespace
}
Will Strohmeier
źródło
0

Użyłem następującej metody, aby wykryć, czy ciąg zawiera tylko białe znaki. Dopasowuje również puste ciągi.

if (/^\s*$/.test(myStr)) {
  // the string contains only whitespace
}
Rajat Saxena
źródło
0

To może być szybkie rozwiązanie

return input < "\u0020" + 1;
9me
źródło
To tylko robienie, return input < " 1"; które jest po prostu porównywaniem alfabetycznym. Dopóki dane wejściowe są posortowane poniżej „1”, zwraca wartość „prawda”. Przykład: return " asdfv34562345" < "\u0020" + 1;zwraca wartość true.
Derek Ziemba