web-dev-qa-db-fra.com

Expression régulière qui autorise les espaces dans une chaîne, mais pas uniquement les espaces

J'ai besoin d'écrire une expression régulière pour la validation de formulaire qui autorise les espaces dans une chaîne, mais pas uniquement les espaces.

Par exemple, 'Chicago Heights, IL' serait valide, mais si un utilisateur appuyait simplement sur la barre d'espace autant de fois que nécessaire, le formulaire ne serait pas validé. Avant la validation, j’ai essayé d’exécuter une if (foo != null) puis d’exécuter l’expression rationnelle, mais le fait de frapper la barre d’espace enregistrait toujours les caractères; Voici ce que j'utilise en ce moment et qui permet les espaces:

^[-a-zA-Z0-9_:,.' ']{1,100}$
12
user699242

Je ne suis pas sûr que vous ayez besoin d'une RegEx ici. Pourquoi ne pas simplement appeler la méthode Trim() de votre langue et vous assurer que la chaîne résultante n'est pas vide?

16
dlev

C'est très simple: .*\S.*

Cela nécessite un caractère non-espace, à tout endroit. La syntaxe des expressions régulières est valable pour les expressions régulières compatibles Perl 5; si vous utilisez un autre langage, la syntaxe peut différer un peu.

32
Roland Illig

Ce qui suit va répondre à votre question comme écrit, mais voir ma note supplémentaire par la suite:

^(?!\s*$)[-a-zA-Z0-9_:,.' ']{1,100}$

Explication: Le (?!\s*$) est un négatif lookahead . Cela signifie: "Les caractères suivants ne peuvent pas correspondre au sous-modèle \s*$." Lorsque vous prenez en compte le sous-modèle, cela signifie: "Les caractères suivants ne peuvent être ni une chaîne vide, ni une chaîne d'espaces jusqu'à la fin. Par conséquent, il doit y avoir au moins un caractère autre qu'espace après ce point dans la chaîne. " Une fois cette règle réglée, vous êtes libre d'autoriser des espaces dans votre classe de personnage.

Note supplémentaire: Je ne pense pas que votre ' ' fasse ce que vous souhaitez. Il semblerait que vous essayiez de représenter un caractère d'espacement, mais regex interprète ' comme une apostrophe littérale. Dans une classe de caractères, ' ' signifierait "correspond à tout caractère qui est soit ', un caractère d'espacement ou '" (notez que le second caractère ' est redondant). Je soupçonne que ce que tu veux est plus comme ça:

^(?!\s*$)[-a-zA-Z0-9_:,.\s]{1,100}$
6
Justin Morgan

Vous pouvez utiliser simple:

^(?=.*\S).+$

si votre moteur regex prend en charge les valeurs positives. Cette expression nécessite au moins un caractère non-espace.

Voir sur rubular .

5
Alex

Si nous voulions appliquer des validations uniquement avec le jeu de caractères autorisé, j'ai essayé avec USERNAME_REGEX = /^(?:\s*[.\-_]*[a-zA-Z0-9]{1,}[.\-_]*\s*)$/;

  • Une chaîne peut contenir n'importe quel nombre d'espaces au début, à la fin ou entre les deux, mais contient au moins un caractère alphanumérique.
  • Les caractères ., _ , - facultatifs sont également autorisés, mais la chaîne doit comporter un caractère alphanumérique.
0
Sandeep Sharma