2013-02-20 67 views
1

我怎样才能创建一个数字的正则表达式用小数点分隔符,但也限制了长正则表达式数字与长

我创建这个:

^[0-9]([0-9]*[.]?[0-9]){1,10}$ 

然后1234567890.1234567890是有效的,但使用20(+ 1 - >小数点分隔符)字符。

我该如何限制为10个字符?

有效期:

1234567890 
123456789.0 
12345678.90 
1234567.890 
123456.7890 
12345.67890 
12345.67890 
1234.567890 
123.4567890 
12.34567890 
1.234567890 

无效:

12345678901 
12345678901. 
123456789.01 
12345678.901 
1234567.8901 
123456.78901 
12345.678901 
12345.678901 
1234.5678901 
123.45678901 
12.345678901 
1.2345678901 
.12345678901 

在此先感谢

+1

老实说,我会只要检查一下它是否匹配'/^\ d +(?:\。\ d *)$ /',然后是's /\.//;'并检查长度。 – 2013-02-20 22:17:31

+0

“.123”或“123.”应该是有效的匹配吗?另外,我猜测指数表示法是不允许的? – 2013-02-20 22:26:46

+0

@LoneShepherd最好的选择是你说的,但是一个动态的形式,我也需要控制长度。 – Equiman 2013-02-21 13:32:47

回答

4
^(?:\d{1,10}|(?!.{12})\d+\.\d+)$ 

说明:

^   # Start of string 
(?:  # Either match... 
\d{1,10} # an integer (up to 10 digits) 
|   # or 
(?!.{12}) # (as long as the length is not 12 characters or more) 
\d+\.\d+ # a floating point number 
)   # End of alternation 
$   # End of string 

请注意,(在你的例子中).123123.无效。

+0

+1使用花哨lookahead断言得到一个正则表达式:-) – Cameron 2013-02-20 22:26:17

+0

@TimPietzker工作就像一个魅力...谢谢!我会稍微改变它'^(?:[0-9] {1,10} |(?!。{12})[0-9] + [。] [0-9] +)$'因为在C#中遇到\字符问题 – Equiman 2013-02-21 13:43:20

+0

Finaly .Net以这种方式完美工作。谢谢! – Equiman 2013-02-25 20:36:05

1

如果你不使用正则表达式来计算长度,它会更加清晰,甚至更快。根据^\d+(?:\.\d+)$进行测试,取出点并取长度。

如果你真的需要它是一个正则表达式,你可以使用lookahead来检查格式分别长度:

^\d{1,10}$|^(?=.{11}$)\d+\.\d+$ 

说明:

^   # At the start of the string 
(?:  # either 
\d{1,10} # up to 10 digits 
|   # or 
(?=  # from here 
    .{11} # 11 characters 
    $  # to the end 
)   # and as well 
\d+\.\d+ # two dot-separated digit sequences 
)   # 
$   # 
+0

谢谢!该解决方案需要全部10位数字。我将它改为:'^ \ d {1,10} $ | ^(?=。{1,11} $)\ d + \。\ d + $'允许1至10位数的变化。 – Equiman 2013-02-21 13:37:11

+1

也许我没有在我的例子中说明这一点。 – Equiman 2013-02-21 13:46:40

+0

是的,我不清楚。我已经调整了答案。 – Bergi 2013-02-21 13:50:17