Compruebe si una cadena tiene espacios en blanco


96

Estoy tratando de verificar si una cadena tiene espacios en blanco . Encontré esta función pero no 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;
}

Por cierto, agregué citas a RegExp.

¿Hay algo mal? ¿Hay algo mejor que pueda usar? Con suerte, JQuery.


su lógica es al revés, verdadero significa falso.
— Brian Schroth

2
Devuelve falso si la cadena tiene espacios en blanco, su lógica está al revés
— Christopher Francisco

Esa expresión regular en cuestión busca patrones con solo espacios en blanco en las cadenas, comienza con espacios en blanco, tiene uno o más espacios en blanco y termina con un espacio en blanco.
— Priya Ranjan Singh

Respuestas:


242

Simplemente puede usar el método indexOf en la cadena de entrada:

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

O puede usar el método de prueba, en una expresión regular simple:

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

Esto también buscará otros caracteres de espacio en blanco como Tab.


18
esto no busca otros tipos de espacios en blanco (por ejemplo, \ t).
— Bernard Chen

3
¿No podrías poner también el índice de (/ ^ \ s + $ /)?
— Zoidberg

2
esto no es compatible con IE8 (solo un amigable para tu información ...)
— gloomy.penguin

@ CMS & @Bernard - No funciona [s.indexOf ('') funciona]
— Shawn Rebelo

21

Su expresión regular no coincidirá con nada, tal como está. Definitivamente necesitas eliminar las comillas, los "/"caracteres son suficientes.

/^\s+$/está comprobando si la cadena es TODOS los espacios en blanco:

  • ^ coincide con el inicio de la cadena.
  • \s+ significa al menos 1, posiblemente más, espacios.
  • $ coincide con el final de la cadena.

Intente reemplazar la expresión regular con /\s/(y sin comillas)


1

Esta función busca otros tipos de espacios en blanco, no solo el espacio (tabulación, 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

Si no desea utilizar Lodash , aquí hay una someimplementación simple con 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;
};

Luego simplemente reemplácelo somecon ssome.

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

Para aquellos en Node, use:

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

0

Aquí está mi validación 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;
    }
}

0

Un enfoque simple que podría tomar es comparar la longitud de la cadena original con la de la cadena para reemplazar los espacios en blanco con nada. Por ejemplo:

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

0

Con adiciones al idioma es mucho más fácil, además puedes aprovechar la devolución anticipada:

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

No ejecuté pruebas comparativas de rendimiento, pero deberían ser más rápidas que las expresiones regulares, pero para los fragmentos de texto pequeños no habrá mucha diferencia de todos modos.


0

Algunos otros han publicado respuestas. Hay algunos problemas obvios, como que regresa falsecuando la expresión regular pasa, y los operadores ^y $indican inicio / fin, mientras que la pregunta que se busca tiene (cualquier) espacio en blanco, y no: solo contiene espacios en blanco (que la expresión regular está verificando).

Además de eso, el problema es solo un error tipográfico.

Cambia esto...

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

A esto...

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

Cuando use una expresión regular dentro RegExp(), debe hacer las dos cosas siguientes ...

  • Omita los /corchetes de inicio y finalización .
  • Haga doble escape al código de todas las secuencias, es decir, \\sen lugar de \s, etc.

Demostración de trabajo completa desde el código fuente ...

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.