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.

Abs
źródło
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.

Christian C. Salvadó
źródło
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)

Ian Clelland
źródło
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');
JesterXL
źródło
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;
    }
}
CyborgHead
źródło
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
}
PaulG
źródło
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.

snnsnn
źródło
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>

HoldOffHunger
źródło