Sprawdź, czy ciąg ma spację


96

Próbuję sprawdzić, czy ciąg ma spację . Znalazłem tę funkcję, ale wygląda na to, że nie działa:

function hasWhiteSpace(s) 
{
    var reWhiteSpace = new RegExp("/^\s+$/");

    // Check for white space
    if (reWhiteSpace.test(s)) {
        //alert("Please Check Your Fields For Spaces");
        return false;
    }

    return true;
}

Nawiasem mówiąc, dodałem cytaty do RegExp.

Czy jest coś nie tak? Czy jest coś lepszego, czego mogę użyć? Mam nadzieję, że JQuery.


Twoja logika jest wsteczna, prawda oznacza fałsz.
— Brian Schroth

2
Zwracasz fałsz, jeśli ciąg ma białe spacje, twoja logika jest odwrotna
— Christopher Francisco

To wyrażenie regularne, o którym mowa, sprawdza wzorce z tylko białymi znakami w łańcuchach, zaczyna się od białych znaków, ma jedną lub więcej białych znaków i kończy się białymi znakami.
— Priya Ranjan Singh

Odpowiedzi:


246

Możesz po prostu użyć metody indexOf w ciągu wejściowym:

function hasWhiteSpace(s) {
  return s.indexOf(' ') >= 0;
}

Lub możesz użyć metody testowej na prostym wyrażeniu regularnym:

function hasWhiteSpace(s) {
  return /\s/g.test(s);
}

Spowoduje to również sprawdzenie innych znaków odstępu, takich jak Tab.


19
nie sprawdza to innych typów białych znaków (np. \ t).
— Bernard Chen

3
nie mógłbyś również wstawić s.indexOf (/ ^ \ s + $ /)?
— Zoidberg

2
to nie jest obsługiwane przez IE8 (tylko przyjacielski fyi ...)
— gloomy.penguin

@ CMS & @Bernard - Nie działa [s.indexOf ('') działa]
— Shawn Rebelo

21

Twoje wyrażenie regularne nie będzie do niczego pasować, tak jak jest. Zdecydowanie musisz usunąć cudzysłowy - "/"znaki są wystarczające.

/^\s+$/sprawdza, czy łańcuch to WSZYSTKIE białe spacje:

  • ^ dopasowuje początek łańcucha.
  • \s+ oznacza co najmniej 1 lub więcej spacji.
  • $ dopasowuje koniec łańcucha.

Spróbuj zamienić wyrażenie regularne na /\s/(bez cudzysłowów)


1

Ta funkcja sprawdza inne rodzaje białych znaków, a nie tylko spację (tabulator, powrót karetki itp.)

import some from 'lodash/fp/some'
const whitespaceCharacters = [' ', '  ',
  '\b', '\t', '\n', '\v', '\f', '\r', `\"`, `\'`, `\\`,
  '\u0008', '\u0009', '\u000A', '\u000B', '\u000C',
'\u000D', '\u0020','\u0022', '\u0027', '\u005C',
'\u00A0', '\u2028', '\u2029', '\uFEFF']
const hasWhitespace = char => some(
  w => char.indexOf(w) > -1,
  whitespaceCharacters
)

console.log(hasWhitespace('a')); // a, false
console.log(hasWhitespace(' ')); // space, true
console.log(hasWhitespace(' ')); // tab, true
console.log(hasWhitespace('\r')); // carriage return, true

Jeśli nie chcesz korzystać z Lodash , oto prosta someimplementacja z 2 s:

const ssome = (predicate, list) =>
{
  const len = list.length;
  for(const i = 0; i<len; i++)
  {
    if(predicate(list[i]) === true) {
      return true;
    }
  }
  return false;
};

Następnie wystarczy zamienić somez ssome.

const hasWhitespace = char => some(
  w => char.indexOf(w) > -1,
  whitespaceCharacters
)

Dla tych w Node użyj:

const { some } = require('lodash/fp');

0

Oto moja sugerowana weryfikacja:

var isValid = false;

// Check whether this entered value is numeric.
function checkNumeric() {
    var numericVal = document.getElementById("txt_numeric").value;

    if(isNaN(numericVal) || numericVal == "" || numericVal == null || numericVal.indexOf(' ') >= 0) {
        alert("Please, enter a numeric value!");
        isValid = false;
    } else {
        isValid = true;
    }
}

0

Jednym prostym podejściem, które możesz zastosować, jest porównanie długości oryginalnego ciągu z długością łańcucha, aby białe spacje zostały zastąpione niczym. Na przykład:

function hasWhiteSpaces(string) {
    if (string.length == string.replace(" ", "").length) {return false}
    return true
}

0

Dzięki dodatkom do języka jest to znacznie łatwiejsze, a dodatkowo możesz skorzystać z wcześniejszego zwrotu:

// Use includes method on string
function hasWhiteSpace(s) {
  const whitespaceChars = [' ', '\t', '\n'];
  return whitespaceChars.some(char => s.includes(char));
}

// Use character comparison
function hasWhiteSpace(s) {
  const whitespaceChars = [' ', '\t', '\n'];
  return Array.from(s).some(char => whitespaceChars.includes(char));
}

const withSpace = "Hello World!";
const noSpace = "HelloWorld!";

console.log(hasWhiteSpace(withSpace));
console.log(hasWhiteSpace(noSpace));

console.log(hasWhiteSpace2(withSpace));
console.log(hasWhiteSpace2(noSpace));

Nie przeprowadziłem testu wydajności, ale powinny one być szybsze niż regex, ale dla małych fragmentów tekstu i tak nie będzie tak dużej różnicy.


0

Kilku innych opublikowało odpowiedzi. Istnieją pewne oczywiste problemy, na przykład zwraca, falsegdy regex przechodzi, a operatory ^i $wskazują początek / koniec, podczas gdy szukane pytanie ma (dowolną) białą spację, a nie: zawiera tylko białe znaki (które sprawdza regex).

Poza tym sprawa jest tylko literówką.

Zmień to...

var reWhiteSpace = new RegExp("/^\s+$/");

Do tego...

var reWhiteSpace = new RegExp("\\s+");

Korzystając z wyrażenia regularnego w obrębie RegExp(), musisz wykonać dwie następujące czynności ...

  • Pomiń /nawiasy początkowe i końcowe .
  • Podwójna zmiana kodu dla wszystkich sekwencji, tj. \\sZamiast \sitd.

Pełne działające demo z kodu źródłowego ....

$(document).ready(function(e) { function hasWhiteSpace(s) {
        var reWhiteSpace = new RegExp("\\s+");
    
        // Check for white space
        if (reWhiteSpace.test(s)) {
            //alert("Please Check Your Fields For Spaces");
            return 'true';
        }
    
        return 'false';
    }
  
  $('#whitespace1').html(hasWhiteSpace(' '));
  $('#whitespace2').html(hasWhiteSpace('123'));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
" ": <span id="whitespace1"></span><br>
"123": <span id="whitespace2"></span>

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.