Verifique se uma string tem espaço em branco

95

Estou tentando verificar se uma string tem espaço em branco . Encontrei esta função, mas não parece estar funcionando:

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;
}

A propósito, adicionei citações a RegExp.

Há algo de errado? Existe algo melhor que eu possa usar? Esperançosamente JQuery.

Abdômen
fonte
sua lógica está invertida, verdadeiro significa falso.
Brian Schroth
2
Você está retornando falso se a string tiver espaço em branco, sua lógica está invertida
Christopher Francisco
Essa regex em questão verifica se há padrões apenas com espaços em branco nas strings, começa com um espaço em branco, tem um ou mais espaços em branco e termina com um espaço em branco.
Priya Ranjan Singh

Respostas:

240

Você pode simplesmente usar o método indexOf na string de entrada:

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

Ou você pode usar o método de teste, em um RegEx simples:

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

Isso também verificará outros caracteres de espaço em branco, como Tab.

CMS
fonte
17
isso não verifica outros tipos de espaço em branco (por exemplo, \ t).
Bernard Chen
3
você não poderia colocar s.indexOf (/ ^ \ s + $ /) também?
Zoidberg
2
isso não é suportado pelo IE8 (apenas um amigo para
saber
@ CMS & @Bernard - Não funciona [s.indexOf ('') funciona]
Shawn Rebelo
21

Sua regex não corresponderá a nada, do jeito que está. Você definitivamente precisa remover as aspas - os "/"caracteres são suficientes.

/^\s+$/está verificando se a string é TODOS os espaços em branco:

  • ^ corresponde ao início da string.
  • \s+ significa pelo menos 1, possivelmente mais, espaços.
  • $ corresponde ao final da string.

Tente substituir o regex por /\s/(e sem aspas)

Ian Clelland
fonte
1

Esta função verifica outros tipos de espaço em branco, não apenas espaço (tab, retorno de carro, etc.)

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

Se você não quiser usar o Lodash , aqui está uma someimplementação simples com 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;
};

Em seguida, basta substituir somepor ssome.

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

Para aqueles no Node, use:

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

Aqui está minha validação sugerida:

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
fonte
0

Uma abordagem simples que você pode adotar é comparar o comprimento da string original com o da string para substituir os espaços em branco por nada. Por exemplo:

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

Com adições ao idioma, é muito mais fácil, além disso, você pode aproveitar o retorno antecipado:

// 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));

Eu não executei benchmark de desempenho, mas eles devem ser mais rápidos do que regex, mas para pequenos trechos de texto não haverá muita diferença de qualquer maneira.

snnsnn
fonte
0

Alguns outros postaram respostas. Existem alguns problemas óbvios, como ele retorna falsequando o Regex passa, e os operadores ^e $indicam início / fim, enquanto a pergunta está procurando tem (qualquer) espaço em branco, e não: contém apenas espaços em branco (que o regex está verificando).

Além disso, o problema é apenas um erro de digitação.

Mude isso...

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

Para isso...

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

Ao usar uma regex dentro RegExp(), você deve fazer as duas coisas a seguir ...

  • Omita os /colchetes inicial e final .
  • Faça um escape duplo do código de todas as sequências, ou seja, \\sno lugar de \setc.

Demonstração de trabalho completa do código-fonte ....

$(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
fonte