expression régulière pour permettre des espaces entre les mots

je veux une expression régulière qui empêche les symboles et n'autorise que les lettres et les nombres. Cette regex fonctionne très bien, mais il ne permet pas d'espaces entre les mots.

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

par exemple, en utilisant cette expression régulière" HelloWorld "est très bien mais" Hello World " ne correspond pas.

Comment puis-je l'ajuster pour permettre des espaces?

118
demandé sur Moak 2013-03-18 12:52:52

14 réponses

tl; dr

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

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


Maintenant, si vous voulez être stricte...

ci-dessus n'est pas tout à fait correcte. En raison du fait que * signifie zéro ou plus , il correspondrait à tous les cas suivants qu'on ne voudrait généralement pas signifier pour correspondre:

  • Une chaîne vide "".
  • une chaîne composée entièrement d'espaces, " ".
  • une corde qui mène et / ou des sentiers avec 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 L'OP posait une question si fondamentale qu'elle me paraissait stricte. n'était pas un sujet de préoccupation. Maintenant que la question a gagné en popularité, je veux dire...

...utilisez la réponse de @stema .

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

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

(Veuillez upvote @stema, peu importe.)

certaines choses à noter à propos de cette (et @stema'S) réponse:

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

    ^\w+( +\w+)*$
    
  • si vous voulez autoriser les onglets et les lignes (caractères d'espace), puis remplacer l'espace par un \s+ :

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

    ici je suggère le + par défaut parce que, par exemple, Windows linebreaks se composent de deux caractères blancs dans la séquence, \r\n , de sorte que vous aurez besoin du + pour attraper les deux.

toujours pas de travail?

Vérifiez quel dialecte des expressions régulières vous utilisez. * dans des langues comme Java, vous devrez échapper à vos backlashs, i.e. \w et \s . Dans les langues et utilitaires plus anciens ou plus basiques, comme sed , \w et \s ne sont pas définis, alors é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 marquée , mais basé sur plus de 25.000 vues, je devine que ce n'est pas seulement ceux les gens qui rencontrent cette question. Actuellement, il est le premier hit sur google pour la phrase de recherche, espace d'expression régulière mot .

234
répondu Andrew Cheong 2018-03-16 05:59:05

une possibilité serait d'ajouter simplement l'espace dans votre classe de caractères, comme acheong87 suggéré, cela dépend de la façon dont vous êtes strict sur votre modèle, parce que cela permettrait également une chaîne de caractères commençant par 5 espaces, ou des chaînes consistant uniquement d'espaces.

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

je vais utiliser \w c'est dans la plupart des regex saveurs de même que [a-zA-Z0-9_] (dans certains, il est 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+ Match d'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 corde

83
répondu stema 2014-03-28 12:30:55

celui-ci a travaillé pour moi

([\w ]+)
18
répondu Mario Rugeles Perez 2014-01-21 17:23:02

Essayez avec:

^(\w+ ?)*$

explication:

\w             - alias for [a-zA-Z_0-9]
"whitespace"?  - allow whitespace after word, set is as optional
10
répondu hsz 2013-03-18 08:55:00

je suppose que vous ne voulez pas d'espace de tête/arrière. Cela signifie que vous devez diviser le regex 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 perl-like:

^\w[\w ]*\w$

aussi: si vous avez intentionnellement formulé votre regex qu'il permet aussi des chaînes vides, vous devez rendre l'ensemble optionnel:

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

si vous voulez n'autoriser que les caractères à un seul espace, il semble un peu différent:

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

ça correspond à 0..n mots suivis d'un espace unique, plus un mot, sans espace. Et rend la chose entière optionnelle pour permettre des chaînes vides.

4
répondu creinig 2014-09-24 11:48:28

ceci ne permet pas d'espace au début. Mais autorises espaces entre les mots. Permet également des caractères spéciaux entre les mots. Un bon regex pour les champs FirstName et LastName.

\w+.*$
3
répondu jaxxbo 2013-09-18 14:48:48

Pour les alphabets seulement:

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

pour la valeur alphanumérique et _ :

^(\w)+(\s)+\w+$
2
répondu bibliophilsagar 2016-09-04 08:11:22

Cette expression régulière

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

ne permettra qu'un seul espace entre les mots et aucun espace menant ou traînant.

ci-Dessous est l'explication de l'expression régulière:

  1. ^ affirmer position au début de la chaîne de caractères
  2. \w+ correspond à un caractère de mot [a-zA-Z0-9_]
    1. Quantificateur: + Entre l'un et temps illimités, autant de fois que possible, donnant en retour selon les besoins [cupide]
    2. 1519260920
    3. 1er groupe de capture (\s\w+)*
      1. quantificateur: * entre temps zéro et temps illimités, autant de fois que possible, donnant en retour selon les besoins [cupide]
      2. \s correspond à un caractère espace blanc [\r\n\t\f ]
      3. \w+ Match n'importe quel caractère de mot [a-zA-Z0-9_]
          "
        1. quantificateur: + entre un et un nombre illimité de fois, autant de fois que possible, donnant en retour si nécessaire [avide]
    4. $ position à la fin de la chaîne
1
répondu Amadeus Sánchez 2016-05-23 23:36:44

a bien examiné bon nombre de ces réponses supposées...

...et bupkis après avoir récuré le débordement de la pile ainsi que d'autres sites pour un regex qui correspond à n'importe quelle chaîne sans espace blanc de départ ou de fuite et seulement un espace unique entre les mots de caractère strictement alpha.

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

ainsi facilement modifié en alphanumérique:

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

(cela ne correspond pas mots simples, mais il suffit d'utiliser un commutateur/if-else avec un simple ^[a-zA-Z0-9]+$ si vous avez besoin d'attraper des mots simples en plus.)

enjoy: d

0
répondu LokizFenrir 2016-05-24 00:34:22

Essayez ce qui suit: (version de Python)

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

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

0
répondu MoMo 2016-09-04 02:57:34

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

([a-z',.-]+( [a-z',.-]+)*){1,70}/
0
répondu Adam K Dean 2016-09-25 14:08:39

tous les codes ci-dessus ne fonctionnent pas lorsque l'utilisateur inclut le caractère du clavier. Donc voici le regx quand l'utilisateur est autorisé à ajouter n'importe quel caractère ou mot mais ils peuvent mettre des espaces entre les mots.Essayez celui-ci.

 ^[^ ]+( [^ ]+)*$
0
répondu Chathuranga Silva 2017-02-17 09:18:33

il suffit d'ajouter un espace à la fin de votre motif regex comme suit:

[a-zA-Z0-9_ ]
0
répondu KayV 2018-09-20 12:19:48

essayez .*? pour permettre les espaces blancs il a travaillé pour moi

-3
répondu user4035152 2014-09-12 14:12:13