2010-03-24 4 views
5

Désolé pour la question potentiellement stupide mais je suis en train de rassembler une expression régulière qui permettra:Expression régulière pour décimal ou blanc

Un nombre avec 1 ou 2 chiffres avant la virgule, et 0-6 numéros après le point décimal. Cependant, je dois également laisser le champ vide si nécessaire.

Exemples valides

0.952321 
1.20394 
12.12 
25 
Blank 

Exemples non valides

123.45678 
1.1234567 

S'il vous plaît quelqu'un peut-il aider?

+0

Quelle langue utilisez-vous? – miorel

+0

que voulez-vous dire par blanc? – PierrOz

Répondre

1

^(?:|\d{1,2}(?:\.\d{0,6})?)$

La partie avant que le tuyau correspond à vide. La partie après correspond à un ou deux chiffres éventuellement suivi d'une période et jusqu'à six chiffres. Les ?: sont donc nous n'utilisons pas de groupes de capture sauf si nécessaire.

Espérons que cela aide!

+0

dans votre regex le. est obligatoire: il ne correspond pas à 25 dans l'exemple ci-dessus – PierrOz

+0

merci pour ce pote –

+0

@PierrOz, ouais j'ai revérifié la question et l'ai réparée :) Merci! – miorel

11
^(?:\d{1,2}(?:\.\d{0,6})?)?$ 

Doit faire l'affaire.

\d  matches any digit 
{n,m} specifies the number of occurrences 
(?:) creates an anonymous group 
^  specifies the start of the string 
$    the end of the string 
?  means the group is optional 
+0

merci pour votre aide –

+3

@Phil P: Si l'une des réponses a résolu votre problème, upvote et/ou accepter la meilleure réponse. – AxelEckenberger

2

Vous devez indiquer la langue dans laquelle vous utilisez l'expression régulière, la plupart possèdent des fonctions qui vous permettront de créer des expressions plus lisibles. Voici un échec de sécurité POSIX regex: Si la partie décimale est facultative,

^([0-9]{1,2}\.[0-9]{0,6})?$ 

vous pouvez utiliser

^([0-9]{1,2}(\.[0-9]{1,6})?)?$ 
+0

+1 pour ne pas correspondre à un nombre se terminant par un nombre décimal (par exemple "25."). Bien que cela ne soit pas explicitement mentionné dans la question, je suppose que cette exigence. – Mark

0
^(\d{1,2}(\.\d{1,6})?)?$ 
+0

Votre expression régulière correspond à un nombre entier à 8 chiffres. – miorel

+0

@Miorel: ah tu as raison :) Je pense que nous aurons le même à la fin :) – PierrOz

+0

Probablement;) J'aime comment vous avez géré l'option vide, je devrais changer le mien à cela! – miorel

0

lecture entre les lignes, j'étendu la définition d'entrée acceptable et non et supposé que vous vouliez seulement capturer le nombre dans le format décrit.

Par exemple, ces chiffres capturerait le nombre à droite et sont toutes les entrées acceptables:

"0.952321 " 0.952321    (trailing spaces stripped)  
" 1.20394 " 1.20394    (leading and trailing spaces stripped) 
"12.12"   12.12    (no leading or trailing spaces) 
"12.123 "  12.123 
" .1234 "   .1234    (no leading digit -- start with decimal) 
"25"     25    (no decimal) 
" "    " " ?    (space. space captured or not) 
"12."    12.    (1 or 2 digits, decimal, no numbers after decimal) 

entrée Non OK:

"."         just a decimal 
"123456789"       more than 2 digits lefthand 
123          ""  "" 
123.45678 
1.1234567        more than 6 digits right hand 
[a-zA_Z]        not a digit... 

Ainsi, étant donné que, cette regex fera il:

/^\s*(     # beginning of string and strip leading space         
| \d{1,2}\.?   # 1 or 2 digits with optional decimal 
| \d{0,2}\.\d{1,6}  # 0,1, 2 digits with a decimal with digits 
| \s+     # remove if you do not want to capture space 
)\s*$     # trailing blanks to the end 
/x 
0

En général, c.-à-d.décimales illimités:

^-?(([1-9]\d*)|0)(.0*[1-9](0*[1-9])*)?$

0

j'utiliser un de ces:

Pour répondre à toutes vos décimales:

(\d+\.\d+){0,1} 

Pour être plus précis en nombre avant/après le point, essayez/variez avec l'un de ceux-ci:

(\d+\.\d{2}){0,1} 
(\d{4}\.\d{2}){0,1}