Comment détecter un nombre à virgule flottante à l'aide d'une expression régulière
Qu'est ce qu'une expression régulière pour le traitement d'un nombre à virgule flottante (c'est à dire comme Java flottant)
La réponse doit correspondre à l'encontre des objectifs suivants:
1) 1.
2) .2
3) 3.14
4) 5e6
5) 5e-6
6) 5E+6
7) 7.e8
8) 9.0E-10
9) .11e12
En résumé, il devrait
- ignorer précédant les signes
- exiger que le premier caractère à gauche du point décimal soit non nul
- permettre à 0 ou plus de chiffres sur chaque côté de la virgule
- permettre à un nombre sans virgule décimale
- permettre la notation scientifique
- permettre de capital ou minuscule "e"
- permettre positif ou négatif exposants
Pour ceux qui se demandent, oui, c'est un problème. Nous avons reçu une affectation dans mes études supérieures CS de classe sur des compilateurs. J'ai déjà tourné dans ma réponse pour la classe et l'affichera comme une réponse à cette question.
[Épilogue]
Ma solution n'a pas obtenir un crédit complet, car il n'a pas de poignée plus de 1 chiffre à gauche de la virgule. La mission a fait mention de la manipulation de Java flotte même si aucun de ces exemples n'ont plus de 1 chiffre à gauche de la virgule. Je vais poster la accepté de répondre dans son propre post.
source d'informationauteur Kelly S. French
Vous devez vous connecter pour publier un commentaire.
Viens de faire à la fois le point décimal et le E-puis-exposant une partie facultative:
Je ne vois pas pourquoi vous ne voulez pas que l'un des principaux
[+-]?
pour capturer un signe possible aussi, mais, qu'importe!-)Modifier: il y aurait en fait pas de chiffres à gauche du point décimal (auquel cas j'imagine qu'il y a doit être le point décimal et 1+ chiffres après la!) ainsi, un vertical-bar (alternative) est à l'évidence nécessaire:
[C'est la réponse du professeur]
Définir:
N = [1-9]
D = 0 | N
E = [eE] [+-]? D+
L = 0 | ( N* )
Puis des nombres à virgule flottante peut être mis en correspondance avec:
( ( L . D* | . D+ ) E? ) | ( L E )
Il est également acceptable d'utiliser de D+, plutôt que de L, et d'ajouter le préfixe [+-]?.
Une erreur commune est d'écrire des D* . D*, mais cela peut correspondre à juste '.'.
[Modifier]
Quelqu'un a demandé à propos de l'un des principaux signe; je devrais lui ont demandé pourquoi il a été exclu, mais n'a jamais eu la chance. Puisque cela faisait partie de la conférence sur les grammaires, ma conjecture est que soit il a rendu le problème plus facile (peu probable) ou il y a un petit détail dans l'analyse, où vous divisez le problème réglée de telle sorte que la valeur à virgule flottante, indépendamment du signe, est le focus (c'est possible).
Si vous êtes l'analyse par le biais d'une expression, par exemple
le signe de la valeur à virgule flottante est une partie de l'opération à appliquer à la valeur et non pas un attribut du nombre lui-même. En d'autres termes,
pour former le résultat de l'expression. Alors que je suis sûr que les mathématiciens peuvent faire valoir le point, souvenez-vous c'était d'une conférence sur l'analyse.
http://www.regular-expressions.info/floatingpoint.html
Voici ce que j'ai tourné en.
Pour le rendre plus facile d'en parler, je vais étiquette les sections
Un: correspond tout à l' 'e/E'
B: correspond à la notation scientifique
De casser nous obtenons trois parties
Partie 1: Permet 1 ou plusieurs chiffres de 1 à 9, décimal, 0 ou plus de chiffres après la virgule (cible 1)
Partie 2: Permet 0 ou plus de chiffres de 1 à 9, décimal, 1 ou plusieurs chiffres après la virgule (cible 2)
Partie 3: Permet 1 ou plusieurs chiffres de 1 à 9 sans décimale (voir le no 4 de la liste des cibles)
Briser B nous obtenons 4 pièces de base
Partie 1: nécessite en majuscule ou en minuscule " e " pour la notation scientifique (par exemple, les cibles 8 & 9)
Partie 2: autorise une option signe, positif ou négatif pour l'exposant (par exemple, les objectifs 4, 5, & 6)
Partie 3: permet 1 ou plusieurs chiffres pour l'exposant (objectif 8)
Partie 4: permet la notation scientifique pour être en option en tant que groupe (cible 3)
C'est l'expression régulière, je suis arrivé à en essayant de résoudre ce genre de tâche dans Matlab. En fait, il ne sera pas détecter correctement les nombres comme (1.) mais quelques modifications supplémentaires peut résoudre le problème... bien, peut-être feriez-correctif:
@Kelly S. français: le signe est absent parce que dans un analyseur aurait ajouté par unaire moins (négation) de l'expression, par conséquent, il n'est pas nécessaire d'être détecté dans le cadre d'un flotteur.
@Kelly S. en français, cette expression régulière correspond à tous vos cas de test.
Source: perldoc perlretut