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 ...
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\n
vous 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
, \w
et \s
ne 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éevb.net, 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 .
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
\w
ceci est dans la plupart des saveurs de regex le même que[a-zA-Z0-9_]
(dans certains c'est basé sur Unicode)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înela source
^- (\w+( \w+)*)$
fonctionné pour moi.Celui-ci a fonctionné pour moi
la source
Essayez avec:
Explication:
la source
ggggggggggggggggggggggggggggggggggggg;
, votre expression régulière mettra beaucoup de temps à atteindre le résultat en raison d'un retour en arrière excessif.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":
ou si vous utilisez une syntaxe de type perl:
Aussi: Si vous avez intentionnellement formulé votre regex qu'il autorise également les chaînes vides, vous devez rendre le tout optionnel:
Si vous souhaitez n'autoriser que les caractères à espace unique, cela est un peu différent:
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.
la source
\s
ne sont pas équivalents.\s
correspond à plus qu'un simple espace.Cette expression régulière
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:
^
Affirmer la position au début de la chaîne\w+
Correspond à n'importe quel caractère de mot[a-zA-Z0-9_]
+
entre un et un nombre illimité de fois, autant de fois que possible, en redonnant au besoin [gourmand](\s\w+)*
*
entre zéro et des temps illimités, autant de fois que possible, redonnant au besoin [gourmand]\s
Correspond à n'importe quel caractère d'espace blanc[\r\n\t\f ]
\w+
Correspond à n'importe quel caractère de mot[a-zA-Z0-9_]
+
entre un et un nombre illimité de fois, autant de fois que possible, en redonnant au besoin [gourmand]$
Affirmer la position à la fin de la chaînela source
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.
la source
Pour les alphabets uniquement:
Pour la valeur alphanumérique et
_
:la source
Ajoutez simplement un espace à la fin de votre modèle regex comme suit:
la source
Essayez ceci: (version Python)
modifier la limite supérieure en fonction de votre ensemble de données
la source
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.
Ainsi facilement modifié en alphanumérique:
(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
la source
[(?<=\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.Je trouve que celui-ci fonctionne bien pour un "FullName":
la source
essayez. *? pour permettre les espaces blancs cela a fonctionné pour moi
la source
.
tout correspond. Ce ne sera probablement pas la solution ici.