web-dev-qa-db-fra.com

Expression régulière pour laisser des espaces entre les mots

Je veux une expression régulière qui évite les symboles et n'autorise que les lettres et les chiffres. La regex ci-dessous fonctionne très bien, mais elle ne permet pas d'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 permettre des espaces?

154
lawphotog

tl; dr

Ajoutez simplement un espace dans votre classe de personnage .

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


Maintenant, si vous voulez être strict ...

Ce qui précède n'est pas tout à fait correct. Étant donné que * signifie zéro ou plus , cela correspond à tous les cas suivants auxquels on ne correspond généralement pas:

  • Une chaîne vide, "".
  • Une chaîne composée entièrement d'espaces, "".
  • Une chaîne qui mène et/ou traîne avec des espaces, "Hello World".
  • Une chaîne contenant 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, OP posant une question tellement fondamentale qu’il semblait que la rigueur n’était pas un problème. Maintenant que la question a gagné en popularité, je tiens à dire ...

... utilise réponse de @ stema .

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

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

(S'il vous plaît upvote @stema peu importe.)

Quelques points à noter à propos de ceci (et de @ stema):

  • Si vous souhaitez autoriser plusieurs espaces entre les mots (par exemple, si vous souhaitez autoriser les doubles espaces accidentels ou si vous utilisez la copie -Pasted d'un fichier PDF), puis ajoutez un + 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 \s+:

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

    Ici, je suggère le + par défaut parce que, par exemple, les sauts de ligne Windows consistent en deux caractères d'espacement en séquence, \r\n, vous aurez donc besoin du + pour attraper les deux.

Ne fonctionne toujours pas?

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


* Je sais que cette question est étiquetée vb.net , mais sur la base de plus de 25 000 vues, je suppose que ce ne sont pas seulement les personnes qui rencontrent cette question. Actuellement, c'est le premier coup sur Google pour la phrase de recherche, espace d'expression régulière Word .

293
Andrew Cheong

Une possibilité serait simplement d’ajouter de l’espace dans votre classe de caractère, comme suggéré par acheong87. Cela dépend de la rigueur avec laquelle vous modifiez votre modèle, car cela autoriserait également une chaîne commençant par 5 espaces ou des chaînes ne contenant que des espaces.

L'autre possibilité est de définir un motif:

Je vais utiliser \w c'est dans la plupart des versions regex identique à [a-zA-Z0-9_] (dans certains cas, il est basé sur Unicode)

^\w+( \w+)*$

Cela permettra 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

\w+ Correspond à une série d'au moins un caractère Word

( \w+)* est un groupe 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 Word

$ correspond à la fin de la chaîne

103
stema

Celui-ci a fonctionné pour moi

([\w ]+)
21
Mario Rugeles Perez

Essayez avec:

^(\w+ ?)*$

Explication:

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

Je suppose que vous ne voulez pas d'espace de début/fin. Cela signifie que vous devez diviser l'expression régulière en "premier caractère", "substance 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 écrit votre expression rationnelle selon laquelle elle autorise également les chaînes vides, vous devez rendre la chose entière facultative:

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

Si vous voulez n'autoriser que les caractères d'espacement simples, cela semble un peu différent:

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

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

4
creinig

Cette expression régulière

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

n'autorisera qu'un seul espace entre les mots et aucun espace de début ou de fin.

Ci-dessous l'explication de l'expression régulière:

  1. ^ Assert la position au début de la chaîne
  2. \w+ Faites correspondre n'importe quel caractère Word [a-zA-Z0-9_]
    1. Quantificateur: + Entre une et plusieurs fois, autant de fois que possible, en donnant au besoin [gourmand]
  3. 1er groupe de capture (\s\w+)*
    1. Quantificateur: * Entre zéro et un nombre illimité de fois, autant de fois que possible, redonner au besoin [gourmand]
    2. \s Correspond à n'importe quel caractère d'espacement blanc [\r\n\t\f ]
    3. \w+ Faites correspondre n'importe quel caractère Word [a-zA-Z0-9_]
      1. Quantificateur: + Entre une et plusieurs fois, autant de fois que possible, en donnant au besoin [gourmand]
  4. $ Assert la position à la fin de la chaîne
2
Amadeus Sánchez

Cela ne permet pas d'espace au début. Mais permet des espaces entre les mots. Permet également des caractères spéciaux entre les mots. Une bonne expression rationnelle pour les champs Prénom et Nom.

\w+.*$
2
jaxxbo

Pour les alphabets seulement:

^([a-zA-Z])+(\s)+[a-zA-Z]+$

Pour la valeur alphanumérique et _:

^(\w)+(\s)+\w+$
2
bibliophilsagar

Je trouve que celui-ci fonctionne bien pour un "FullName":

([a-z',.-]+( [a-z',.-]+)*){1,70}/
0
Adam K Dean

J'ai bien regardé beaucoup de ces supposées réponses ...

... et bupkis après avoir parcouru Stack Overflow ainsi que d'autres sites pour une expression rationnelle qui correspond à n'importe quelle chaîne sans début ni fin de blanc et n seul espace entre des mots de caractère strictement alpha.

^[a-zA-Z]+[(?<=\d\s]([a-zA-Z]+\s)*[a-zA-Z]+$

Donc facilement modifié en alphanumérique:

^[a-zA-Z0-9]+[(?<=\d\s]([a-zA-Z0-9]+\s)*[a-zA-Z0-9]+$

(Cela ne correspond pas à des mots simples mais utilisez simplement un commutateur/if-else avec un simple ^[a-zA-Z0-9]+$ si vous devez attraper des mots simples en plus.)

profiter: D

0
LokizFenrir

Ajoutez simplement un espace à la fin de votre motif regex comme suit:

[a-zA-Z0-9_ ]
0
KayV

Tous les codes ci-dessus ne fonctionnent pas lorsque l'utilisateur inclut un caractère de clavier. Voici donc le regx lorsque l'utilisateur est autorisé à ajouter un caractère ou un mot mais qu'il peut insérer des espaces entre les mots. Essayez celui-ci.

 ^[^ ]+( [^ ]+)*$
0
Chathuranga Silva

si les espaces sont facultatifs, vous pouvez faire correspondre:

string1 = 'hello_World'

ou

string2 = 'hello world'

par

pattern = '[\w\s]+'
0
tanzil

Essayez ceci: (version Python)

"(A-Za-z0-9 ){2, 25}"

changer la limite supérieure en fonction de votre ensemble de données

0
MoMo