2009-07-22 10 views
0

Existe-t-il un moyen facile de prendre une valeur décimale dynamique et de créer une expression régulière de validation qui peut gérer cela?Expression régulière pour correspondre à une plage de valeurs décimales

Par exemple, je sais que /1[0-9]{1}[0-9]{1}/ devrait correspondre à quoi que ce soit de 100 à 199, alors quelle serait la meilleure façon de créer par programme une structure similaire avec n'importe quel nombre décimal? Je pensais pouvoir boucler chaque chiffre et en construire un à partir de là, mais je ne sais pas comment j'y arriverais.

+5

Soyez conscient que vous courrez dans toutes sortes de cas bizarres avec différents séparateurs décimaux, séparateurs de milliers et d'autres choses spécifiques de la culture. Les nombres décimaux et les expressions régulières deviennent facilement désordonnés. –

+7

Quel est le problème avec 'decimal.TryParse' qui vous donne envie de faire cela? –

+1

@Mehrdad - Votre commentaire devrait être une réponse. –

Répondre

1

Les plages sont difficiles à gérer correctement avec les expressions régulières. Les ER sont un outil pour l'analyse textuelle ou l'appariement de modèles, et non pour l'analyse sémantique. Le mieux que vous pouvez probablement faire en toute sécurité est de reconnaître une chaîne qui est un nombre avec un certain nombre de chiffres. Vous pouvez construire des RE pour le nombre maximum ou minimum de chiffres pour une gamme en utilisant un logarithme de base 10. Par exemple, le match un nombre entre un et bb>un, construire le RE par:

re = "[1-9][0-9]{" 
re += str(log10(a)-1) 
re += "-" 
re += str(log10(b)-1) 
re += "}" 

Remarque: l'exemple est en aucun langage de programmation. Désolé, C# pas vraiment parlé ici. Il existe quelques problèmes de point de limite, mais l'idée de base est de construire un RE comme [1-9][0-9]{1} pour quelque chose entre 100 et 999 et si la chaîne correspond à l'expression, convertir en un entier et faire l'analyse de plage dans l'espace de valeur à la place de l'espace lexical. Avec tout cela dit ... Je voudrais aller avec la solution de Mehrdad et utiliser quelque chose fourni par le langage comme decimal.TryParse et ensuite vérifier le résultat.

1

^[-]? \ D +

$

validera un numéro avec un point décimal en option et/ou signe moins au

+0

oui, je comprends cela, mais cela ne concerne pas les gammes. –

+0

Je reconsidérerais en utilisant une expression régulière pour cela et juste utiliser un langage de programmation (C#, javascript, peu importe). Une regex n'est pas vraiment le bon outil pour le travail ici - à moins qu'il y ait une raison pour laquelle vous êtes absolument obligé d'utiliser une regex. – Tekdream

0

avant Non, est la réponse simple (\ d +.)?. Générer l'expression régulière qui fonctionnera correctement serait plus compliqué que de faire ce qui suit:

  1. Expression décimale (trouver les nombres décimaux dans une chaîne). "^\$?[+-]?[\d,]*(\.\d*)?$"
  2. Convertir le résultat en nombre décimal et le comparer à votre plage. (decimal.TryParse)

Cela dépend où et ce que vous voulez analyser.

+0

Dans ce cas, utilisez un validateur personnalisé comme le suggère Andrew Hare. –

+0

Cela fonctionne pour moi dans les contrôles de validation –

0

Utilisation de RegEx ci-dessous pour analyser les chaînes pour les nombres. Peut gérer les virgules et les points.

[^\d.,](?<number>(\d{1,3}(\.\d{3})*,\d+|\d{1,3}(,\d{3})*\.\d+|\d*[,\.]\d+|\d+))[^\d.,]

Questions connexes