C# Regex.IsMatch retourne vrai quand il ne devrait pas?
Je suis d'essayer de correspondre à une chaîne de caractères qui peut contenir n'importe quel nombre de caractères numériques ou un point décimal à l'aide de la regex suivante:
([0-9.])*
Voici un code C# pour tester la regex:
Regex regex = new Regex("([0-9.])*");
if (!regex.IsMatch("a"))
throw new Exception("No match.");
J'attends l'exception levée ici, mais il n'est pas - suis-je utiliser les Regex de manière incorrecte ou est-il une erreur dans le modèle?
EDIT: j'aimerais aussi correspondre à une chaîne vide.
essayer de s'échapper de la virgule décimale. Je crois que les RegEx, c'est la compréhension qu'il soit "n'importe quel caractère".
OriginalL'auteur James Cadd | 2011-01-09
Vous devez vous connecter pour publier un commentaire.
La
*
quantificateur signifie "correspond à 0 ou plus". Dans votre cas, "un" renvoie 0 matchs, donc la regex réussit toujours. Vous avez probablement voulu:La
+
quantificateur signifie "match 1 ou plus, donc il échoue sur la non-entrées numériques et ne donne aucun résultat. Un tour rapide de la regex testeur montre:Semble que nous avons quelques faux positifs, nous allons réviser les regex en tant que tel:
Maintenant, nous obtenons:
Fraîcheur.
Cadd: oui.
^((?:[0-9]+(?:\.[0-9]+)?)|\s*)$
. Mais pour garder votre regex simple, vous devriez probablement utiliserstr == "" || IsMatch(...)
.Oh, et une dernière pensée, vous devriez éviter de regex, si possible. Il y a des petites nuances que vous pourriez ne pas être en mesure de prendre en compte dans votre regex, à l'instar de la mondialisation.
.
n'est pas un universel séparateur décimal, et l'expression rationnelle dans sa forme actuelle ne prend pas en compte pour 1000s des séparateurs. Pensez à utiliserdecimal.TryParse
si possible.OriginalL'auteur Juliet
C'est parce que le groupe peut correspondre à ZÉRO fois ou plus.
OriginalL'auteur
Vous devez utiliser + à la place de *
Cela devrait fonctionner correctement.
Lorsque vous utilisez * n'importe quelle chaîne peut correspondre à ce modèle dans votre cas.
OriginalL'auteur Alex Zinchenko