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}$
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?
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.
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}$
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 .
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*)$/;
., _ , -
facultatifs sont également autorisés, mais la chaîne doit comporter un caractère alphanumérique.