268 votes

Expression régulière pour autoriser les espaces entre les mots

Je veux une expression régulière qui empêche les symboles et n'autorise que les lettres et les chiffres. L'expression régulière ci-dessous fonctionne très bien, mais elle ne tient pas compte des espaces entre les mots.

^[a-zA-Z0-9_]*$

Par exemple, lorsque vous utilisez cette expression régulière, "HelloWorld" convient, mais "Hello World" ne correspond pas.

Comment puis-je le modifier pour autoriser les espaces ?

538voto

Andrew Cheong Points 11331

En résumé

Il suffit d'ajouter un espace dans votre classe de caractères .

^[a-zA-Z0-9_ ]*$

Maintenant, si tu veux être strict...

Ce qui précède n'est pas tout à fait exact. En raison du fait que * signifie zéro ou plus il correspondrait à tous les cas suivants que l'on n'aurait pas l'intention de correspondre habituellement :

  • Une chaîne vide, "".
  • Une chaîne de caractères composée uniquement d'espaces, " ".
  • Une chaîne de caractères qui commence et / ou se termine par des espaces, " Hello World ".
  • Une chaîne qui contient plusieurs espaces entre les mots, "Hello World".

À l'origine, je ne pensais pas que de tels détails valaient la peine d'être abordés, car le PO posait une question tellement basique qu'il semblait que la rigueur n'était pas une préoccupation. Cependant, maintenant que la question a gagné en popularité, je tiens à dire...

...utiliser Réponse de @stema .

Ce qui, dans mon goût (sans utiliser \w ) se traduit par :

^[a-zA-Z0-9_]+( [a-zA-Z0-9_]+)*$

(S'il vous plaît upvote @stema quand même.)

Quelques éléments à noter concernant cette réponse (et celle de @stema) :

  • Si vous voulez permettre multiple des espaces entre les mots (par exemple, si vous souhaitez autoriser les doubles espaces accidentels, ou si vous travaillez avec du texte copié-collé à partir d'un PDF), puis ajoutez une balise + après l'espace :

    ^\w+( +\w+)*$
  • Si vous souhaitez autoriser les tabulations et les nouvelles lignes (caractères d'espacement), remplacez l'espace par un caractère \s+ :

    ^\w+(\s+\w+)*$

    Je suggère ici le + par défaut car, par exemple, les sauts de ligne de Windows sont constitués de deux les caractères d'espacement en séquence, \r\n vous aurez donc besoin du + pour attraper les deux.

Cela ne fonctionne toujours pas ?

Vérifiez le dialecte des expressions régulières que vous utilisez. * Dans des langages comme Java, vous devrez échapper vos antislashes, c'est-à-dire \\w y \\s . Dans les langages et les utilitaires plus anciens ou plus basiques, tels que sed , \w y \s ne sont pas définis, alors écrivez-les avec des classes de caractères, par exemple [a-zA-Z0-9_] y [\f\n\p\r\t] respectivement.


* Je sais que cette question est étiquetée vb.net mais si l'on se base sur plus de 25 000 vues, j'imagine qu'il n'y a pas que ces personnes qui se posent cette question. Actuellement, c'est le premier résultat sur Google pour la phrase de recherche, expression régulière mot espace .

162voto

stema Points 36113

Une possibilité serait d'ajouter l'espace dans votre classe de caractères, comme l'a suggéré acheong87. Cela dépend du degré de rigueur de votre modèle, car cela autoriserait également une chaîne commençant par 5 espaces, ou des chaînes composées uniquement d'espaces.

L'autre possibilité est de définir un modèle :

Je vais utiliser \w dans la plupart des versions de regex, c'est la même chose que [a-zA-Z0-9_] (dans certains cas, elle est basée sur Unicode)

^\w+( \w+)*$

Cela permet une série d'au moins un mot et les mots sont divisés par des espaces.

^ Correspond au début de la chaîne de caractères

\w+ Faire correspondre une série d'au moins un caractère de mot

( \w+)* est un groupe qui est répété 0 fois ou plus. Dans le groupe, il attend un espace suivi d'une série d'au moins un caractère de mot.

$ correspond à la fin de la chaîne

39voto

Celui-ci a fonctionné pour moi

([\w ]+)

15voto

hsz Points 46509

Essayez avec :

^(\w+ ?)*$

Explication :

\w             - alias for [a-zA-Z_0-9]
"whitespace"?  - allow whitespace after word, set is as optional

13voto

creinig Points 884

Je suppose que vous ne voulez pas d'espace de tête/de queue. Cela signifie que vous devez diviser la regex en "premier caractère", "espace au milieu" et "dernier caractère" :

^[a-zA-Z0-9_][a-zA-Z0-9_ ]*[a-zA-Z0-9_]$

ou si vous utilisez une syntaxe de type perl :

^\w[\w ]*\w$

Aussi : Si vous avez intentionnellement formulé votre regex de manière à ce qu'elle autorise également les chaînes de caractères vides, vous devez rendre l'ensemble facultatif :

^(\w[\w ]*\w)?$

Si vous souhaitez n'autoriser que les caractères à espacement unique, la situation est un peu différente :

^((\w+ )*\w+)?$

Cela correspond à 0..n mots suivis d'un seul espace, plus un mot sans espace. Et rend le tout optionnel pour permettre les chaînes vides.

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