Regex pour UN ou plusieurs lettres/chiffres Et de ZÉRO ou plusieurs espaces
Je veux permettre à 0 ou plusieurs espaces blancs dans mon string et d'un ou plusieurs A-Z ou A-z ou 0-9 dans ma chaîne.
Regex permettant un espace de caractères en Java
suggère [0-9A-Za-z ]+
.
Je doute que, cette expression correspond à des schémas d'avoir zéro, un ou plusieurs espaces blancs.
Quoi faire pour permettre à 0 ou plus des espaces n'importe où dans la chaîne et un ou plusieurs caractères dans la chaîne.
Ce travail? ([0-9A-Za-z]+)([ ]*)
- Par un hasard, connaissez-vous la première lettre n'est pas un blanc?
- pourquoi avez-vous des doutes? Elle correspond à "blancs" - si vous voulez accepter tous les espaces, l'utilisation
[0-9A-Za-z\s]+
([0-9A-Za-z]+)([ ])*
exigera qu'il ne peut pas commencer par un espace.- Édité. Je voulais dire zéro, un ou plusieurs espaces.
^(.*\p{Blank}?\p{Alnum}+.*\p{Blank}?)$
cela va le faire.- Zéro, un ou plusieurs espaces de... eh Bien, la regex couvre TOUT, sauf le cas de
zero whitespaces
- pour cela, utilisez un vide-chaîne de vérifier et vous avez obtenu tout ce que vous devez.
Vous devez vous connecter pour publier un commentaire.
Je crois que vous pouvez faire quelque chose comme ceci:
C'est 0 ou plusieurs espaces, suivie par au moins 1 numérique char, suivi de 0 ou plusieurs espaces
^^ tout ça au moins une fois.
À l'aide de Pshemo l'idée de possessif des quantificateurs pour accélérer la regex.
Good
sera compensée par la[0-9A-Za-z]+
, puis depuis ça ne fonctionne pas, il va atteindre le début du groupe nouveau et correspondre à l'espace avec[ ]*
, et répétez.([ ]*[0-9A-Za-z])+
est équivalent à([ ]*[0-9A-Za-z]+)+
(c'est ce que je voulais dire dans mon commentaire)([ ]*[0-9A-Za-z]*)+
ou même([ ]?[0-9A-Za-z]?)+
([foo]+)+
sent le retour en arrière catastrophique.[0-9A-Za-z ]([ ][0-9A-Za-z]|[0-9A-Za-z]|[ ])+
([0-9A-Za-z ]+[ ]*)+
fonctionne aussi bien. Il y a une tonne de variations de ce fait.*
et+
pourrait accélérer la regex.([ ]*+[0-9A-Za-z]++[ ]*+)+
.([ ]*+[0-9]++[A-Za-z]++[ ]*+)+
. Cela ne fonctionne pas. Quel est le problème ici?*
signifiezero or more
équivalent à{0,}
+
signifieone or more
équivalent à{1,}
alors regardez cette
[A-Z]+
signifieat least one Capital Letter
, peut être écrite comme[A-Z]{1,}
[!@#$%&].
signifie que vous pouvez avoir ces Caractères Spéciauxzero or more times
peut être écrite comme[!@#$%&]{0,}
désolé, mais
Vous pouvez également essayer ceci :
Utilisation d'anticipation:
(?=.*\s*)
semble redondant.Avant de regarder les autres réponses, je suis arrivé à le faire dans les deux regexes:
Cela correspond à une ou plusieurs lettres/chiffres et zéro ou plusieurs espaces, mais pas seulement des espaces (ou rien).
Il pourrait être rendue efficace par la création préalable d'un seul comparateur d'objet pour chaque regex:
De sortie:
Intéressant regex question du jour.
Vous demandez que la chaîne (
s
) satisfait à cette condition (remarque: laissezc∈s
direc∈{x|x is a character in s}
. Aussi,[]
représentent regex classes de caractères):Considérer la négation:
Alors maintenant, nous voulons construire une regex qui contient soit un non-alphanumériques et de caractère non espace ou est composé uniquement de caractères non alphanumériques.
La première est simple:
[^0-9A-Za-z ]
.Le second lui est semblable:
^[^0-9A-Za-z]*$
Les combiner pour obtenir:
[^0-9A-Za-z ]|^[^0-9A-Za-z]*$
Maintenant nous avons besoin de nier cette regex. Évidemment, nous pouvons juste faire
(?![^0-9A-Za-z ]|^[^0-9A-Za-z]*$)
. Ou nous pourrions manuellement nier la regex:[^0-9A-Za-z ]
devient^[0-9A-Za-z ]*$
^[^0-9A-Za-z]*$
devient[0-9A-Za-z]
. (remarque: nous pourrions facilement nous sont arrivés ici depuis le début)Mais maintenant nous avons besoin de les combiner avec des ET les, pas OU:
Depuis
[0-9A-Za-z]
est un sous-ensemble de[0-9A-Za-z ]
, nous pouvons simplement faire ceci:Noter que nous pouvons simplifier à:
Cela nécessite juste que le personnage qui correspond à
[0-9A-Za-z]
est le dernier personnage qui pourrait le faire. Nous pourrions également faireQui exigerait que le caractère qui correspond à
[0-9A-Za-z]
est le premier personnage qui pourrait le faire.Alors maintenant, nous avons terminé. On peut soit utiliser l'un de ces ou
(?![^0-9A-Za-z ]|^[^0-9A-Za-z]*$)
.Remarque:
String#match
agit comme si la regex est^ + regex + $
(où+
est la concaténation). Cela peut jeter un peu de choses.Ou Tout Simplement:
Exemple
PatternSyntaxException
.