141 votes

Vérifier si une chaîne de caractères comporte des espaces blancs

J'essaie de vérifier si une chaîne de caractères a des espaces blancs . J'ai trouvé cette fonction mais elle ne semble pas fonctionner :

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

Au fait, j'ai ajouté des guillemets à RegExp .

Y a-t-il un problème ? Y a-t-il quelque chose de mieux que je puisse utiliser ? JQuery, j'espère.

0 votes

Votre logique est à l'envers, vrai signifie faux.

2 votes

Tu retournes false si la chaîne a des espaces, ta logique est inversée.

0 votes

La regex en question vérifie les motifs comportant uniquement des espaces dans les chaînes de caractères, commençant par un espace, comportant un ou plusieurs espaces et se terminant par un espace.

321voto

CMS Points 315406

Vous pouvez simplement utiliser le indexOf sur la chaîne de caractères d'entrée :

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

Ou vous pouvez utiliser la méthode de test, sur un simple RegEx :

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

Cela permettra également de vérifier la présence d'autres caractères d'espace blanc comme la tabulation.

27 votes

Cela ne vérifie pas les autres types d'espaces blancs (par exemple, \t ).

3 votes

Ne pourriez-vous pas mettre dans s.indexOf(/^ \s +$/) également ?

2 votes

Cette fonction n'est pas supportée par IE8 (juste un petit conseil amical...)

34voto

Ian Clelland Points 15066

Votre regex ne correspondra à rien, comme c'est le cas. Vous devez absolument supprimer les guillemets -- le "/" sont suffisants.

/^\s+$/ vérifie si la chaîne est TOUTES les espaces blancs :

  • ^ correspond au début de la chaîne.
  • \s+ signifie au moins un espace, voire plus.
  • $ correspond à la fin de la chaîne.

Essayez de remplacer le regex par /\s/ (et sans guillemets)

8voto

snnsnn Points 81

El test est la meilleure façon de procéder. La classe de caractères \s vérifie la présence de tout caractère d'espacement, y compris l'espace, la tabulation, le retour chariot et le saut de page.

Le drapeau global n'est pas nécessaire puisque nous recherchons une seule correspondance. Les littéraux de Regex s'exécutent plus rapidement que leurs équivalents constructeurs car ils sont mieux optimisés par le runtime.

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

console.log(hasWhiteSpace("Hello World!"));
console.log(hasWhiteSpace("HelloWorld!"));

console.time('hasWhiteSpace');
for (let i = 0; i < 1_000_000; i++) {
  hasWhiteSpace("Some text here");
}
console.timeEnd('hasWhiteSpace');

Si vous ne travaillez qu'avec certains caractères d'espacement, vous pouvez tirer parti des méthodes de tableau telles que some qui renvoie la première correspondance réussie, mais ils seront plus lents que la méthode de test de la regex :

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

console.log(hasWhiteSpace("Hello World!"));
console.log(hasWhiteSpace("HelloWorld!"));

console.time('hasWhiteSpace');
for (let i = 0; i < 1_000_000; i++) {
  hasWhiteSpace("Some text here");
}
console.timeEnd('hasWhiteSpace');

Comme vous pouvez le voir dans les repères de performance, la test est légèrement plus rapide que la méthode some qui ne sera de toute façon pas perceptible.

4voto

HoldOffHunger Points 1

Quelques autres ont posté des réponses. Il y a quelques problèmes évidents, comme le fait qu'il renvoie false lorsque la Regex passe, et le ^ y $ indiquent le début/la fin, alors que la question cherche has (any) whitespace, et non : only contains whitespace (ce que la regex vérifie).

En dehors de cela, il ne s'agit que d'une faute de frappe.

Changez ça...

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

A ce...

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

Lorsque l'on utilise une expression rationnelle dans RegExp() vous devez faire les deux choses suivantes...

  • Omettre le début et la fin / des crochets.
  • Double-échapper toutes les séquences de code, c'est-à-dire, \\s à la place de \s etc.

Démonstration complète du fonctionnement à partir du code source....

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

2voto

JesterXL Points 96

Cette fonction vérifie les autres types d'espaces, et pas seulement les espaces (tabulation, retour chariot, 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 vous ne voulez pas utiliser Lodash alors voici une simple some mise en œuvre avec 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;
};

Il suffit alors de remplacer some con ssome .

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

Pour ceux qui sont dans Node, utilisez :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X