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

191

Je veux une expression régulière qui empêche 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 autoriser des espaces?

Lawphotog
la source

Réponses:

372

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 cela *signifie zéro ou plus , cela correspondrait à tous les cas suivants que l'on ne voudrait généralement pas faire correspondre:

  • Une chaîne vide, "".
  • Une chaîne composée entièrement d'espaces, "".
  • Une chaîne qui mène et / ou suit 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 approfondis, car OP posait une question si fondamentale qu'il semblait que la rigueur n'était pas un problème. Maintenant que la question a gagné en popularité, je veux dire ...

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

Ce qui, dans ma saveur (sans utiliser \w) se traduit par:

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

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

Quelques points à noter à ce sujet (et la réponse de @ stema):

  • Si vous souhaitez autoriser plusieurs 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), ajoutez un +après l'espace:

    ^\w+( +\w+)*$
  • Si vous souhaitez autoriser les tabulations et les retours à la ligne (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 se composent de deux caractères d' espacement en séquence, \r\nvous aurez donc besoin de +pour attraper les deux.

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 contre-obliques, c'est \\w -à- dire et \\s. Dans les langues et les services publics plus âgés ou plus basiques, comme sed, \wet \sne sont pas définis, afin de les écrire 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 taguée, mais sur la base de plus de 25 000 vues, je suppose que ce ne sont pas seulement ces personnes qui rencontrent cette question. Actuellement, c'est le premier appel sur google pour l'expression de recherche, mot d'espace d'expression régulière .

Andrew Cheong
la source
3
il permet une chaîne vide
Neha Choudhary
1
Wow, si simple! Merci. N'y a-t-il pas un site ou quelque chose que l'on puisse utiliser pour générer des expressions régulières, pour noobs je veux dire ...
Pierre
1
@Pierre - Il est assez difficile de prendre des instructions humaines et de les convertir en règles explicites. (Le langage humain est fluide et plein d'ambiguïtés, et nos cerveaux font l'essentiel du travail nécessaire pour résoudre les problèmes et combler les lacunes. Les ordinateurs n'ont pas un tel cerveau et les tentatives intelligentes pour en imiter un ne sont pas encore assez puissantes. ) Il existe des outils comme debuggex.com qui représentent visuellement votre regex, mais aussi attrayants soient-ils, ils peuvent ne pas être très utiles pour les débutants. Cependant, je recommande un didacticiel interactif pour obtenir les bases.
Andrew Cheong
1
Oui, votre expression régulière correspondra également s'il n'y a que des espaces. Ma réponse était au commentaire de Neha choudary.
Rajshekar Reddy
1
@Pierre Trois ans plus tard - je suis tombé sur cette question aujourd'hui, j'ai vu votre commentaire; J'utilise regex hero ( regexhero.net ) pour tester les expressions régulières. Je pense que la version en ligne ne fonctionne que dans Internet Explorer avec Silverlight mais c'est mieux que rien.
Michael Armes
122

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

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

J'utiliserai \wceci est dans la plupart des saveurs de regex le même que [a-zA-Z0-9_](dans certains c'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+ Faire correspondre une série d'au moins un caractère de mot

( \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 mot caractère

$ correspond à la fin de la chaîne

stema
la source
Ceci: regex101.com/#javascript fournit également une bonne explication pour le modèle de regex que vous souhaitez analyser.
Dark Star1
Nice Regex, beaucoup plus simple que beaucoup de [0-9a-z] etc
George
J'ai trouvé dans mon interpréteur de regex que je devais mettre la chaîne entière entre parenthèses pour que la première correspondance soit la chaîne entière, et pas seulement les mots venant après le premier espace. Cela a ^- (\w+( \w+)*)$fonctionné pour moi.
NoseKnowsTout
26

Celui-ci a fonctionné pour moi

([\w ]+)
Mario Rugeles Perez
la source
1
Cette réponse manque d'explication.
mickmackusa
12

Essayez avec:

^(\w+ ?)*$

Explication:

\w             - alias for [a-zA-Z_0-9]
"whitespace"?  - allow whitespace after word, set is as optional
hsz
la source
2
Cela va induire un enfer de retour en arrière.
nhahtdh
1
Par exemple, étant donné une chaîne qui ne correspond pas ggggggggggggggggggggggggggggggggggggg;, votre expression régulière mettra beaucoup de temps à atteindre le résultat en raison d'un retour en arrière excessif.
nhahtdh
Ok, alors que proposez-vous?
hsz
7

Je suppose que vous ne voulez pas d'espace de début / de fin. Cela signifie que vous devez diviser l'expression régulière en "premier caractère", "trucs 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 qu'il autorise également les chaînes vides, vous devez rendre le tout optionnel:

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

Si vous souhaitez n'autoriser que les caractères à espace unique, cela est 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.

creinig
la source
Espace et \sne sont pas équivalents. \scorrespond à plus qu'un simple espace.
nhahtdh
@nhahtdh: Merci pour le commentaire. Je suis trop habitué à faire correspondre les espaces en général, je suppose. La réponse est fixe.
creinig
Est-il possible qu'il vous manque une parenthèse fermante) dans la première expression? Je ne suis pas sûr de ne pas l'avoir essayé.
ssinfod
1
@ssinfod: Bonne prise. En fait, la parenthèse ouvrante est superflue dans cet exemple. Merci.
creinig
4

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.

Voici l'explication de l'expression régulière:

  1. ^ Affirmer la position au début de la chaîne
  2. \w+ Correspond à 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, en redonnant au besoin [gourmand]
  3. 1er groupe de capture (\s\w+)*
    1. Quantificateur: *entre zéro et des temps illimités, autant de fois que possible, redonnant au besoin [gourmand]
    2. \s Correspond à n'importe quel caractère d'espace blanc [\r\n\t\f ]
    3. \w+ Correspond à 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, en redonnant au besoin [gourmand]
  4. $ Affirmer la position à la fin de la chaîne
Amadeus Sánchez
la source
2

Cela ne laisse pas d'espace au début. Mais permet des espaces entre les mots. Permet également les caractères spéciaux entre les mots. Une bonne regex pour les champs FirstName et LastName.

\w+.*$
jaxxbo
la source
Cette réponse est incorrecte / inexacte. Ce modèle correspond à un ou plusieurs caractères alphanumériques, traits de soulignement, puis zéro ou plus de tout caractère non-nouvelle ligne. Pas bon pour l'OP.
mickmackusa
2

Pour les alphabets uniquement:

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

Pour la valeur alphanumérique et _:

^(\w)+(\s)+\w+$
bibliophilesagar
la source
1
ce n'est pas un bon exemple, car (quelque chose) + n'est pas la même chose que (quelque chose +). Dans le premier exemple, un seul caractère sera capturé comme $ 1.
Znik
1

Ajoutez simplement un espace à la fin de votre modèle regex comme suit:

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

Essayez ceci: (version Python)

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

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

MoMo
la source
-1

J'ai bien examiné plusieurs de ces supposées réponses ...

... et bupkis après avoir parcouru Stack Overflow ainsi que d'autres sites pour une regex qui correspond à n'importe quelle chaîne sans espace blanc de début ou de fin et seulement un seul espace entre les mots de caractères 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 à des mots simples, mais utilisez simplement un commutateur / if-else avec un simple ^[a-zA-Z0-9]+$si vous devez attraper des mots uniques en plus.)

profiter: D

LokizFenrir
la source
3
[(?<=\d\s]correspond à un caractère: (, ?, <, =, un chiffre ou un caractère des espaces, et qui ne peuvent être ce que vous vouliez dire. Si c'était censé être un regard en arrière, ça devrait l'être (?<=\d\s), mais cela n'a aucun sens là-bas; le regex ne correspondrait jamais.
Alan Moore
Aux votants positifs: veuillez ne pas voter pour les mauvaises solutions. Ils confondent les autres utilisateurs et leur font croire que les regex peuvent faire des choses qu'elles ne font pas.
Wiktor Stribiżew
-1

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

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

essayez. *? pour permettre les espaces blancs cela a fonctionné pour moi

utilisateur4035152
la source
C'est parce que .tout correspond. Ce ne sera probablement pas la solution ici.
rubik
il correspond à zéro ou à n'importe quel caractère, dépend de ce qui est avant et après cette séquence. cela correspondra le moins possible. un point unique représente n'importe quel caractère unique.
Znik