正则表达式几乎完美的数值

时间:2014-04-28 20:27:29

标签: c# regex

我有这个REGEX 几乎完美...它似乎处理所有除了一个带有负号然后是小数的数字。所以,如果我输入:

-.2

我收到错误 -

这是我的正则表达式 - 我测试的其他所有内容都完美无缺......

^(\+|-)?[0-9]{1,11}?(?:\.[0-9]{1,4})?$

这允许:

  • 最多11位数(99亿)的数字
  • 正数或负数
  • 最多4个小数位(可选)
  • 小数点前的前导0是可选的 - 仅适用于正数

这些都有效:

-0.2345
-10
12
.125
0.1245
5.555
25000000000 (aka 25 Billion)
25000000000.25 

这些不起作用:

-.2
-.421

6 个答案:

答案 0 :(得分:20)

正则表达式可能很昂贵......为什么不使用Decimal.Parse或Float.parse?

您目前的实施方式永远不会适用于其他数字样式,例如欧洲。 (点)和,(逗号)互换...而Decimal.Parse将:

string stringValue = "45.889,33";
CultureInfo currentCulture = Thread.CurrentCulture; //set this way up in the execution chain
decimal thenumber = Decimal.Parse(stringValue, currentCulture);
//thenumber = 45889.33 in us-en display format.

数值解析不是正则表达式的理想选择,IMO。

答案 1 :(得分:9)

试试这个:

^(\+|-)?[0-9]{0,11}?(?:\.[0-9]{1,4})?$

<强>更新

上述正则表达式接受字符串+-(空字符串)。您可以使用预测来限制它们。前瞻确保+-符号后必须有字符。

正确的解决方案是:

^(\+|-)?(?=.{1})[0-9]{0,11}(?:\.[0-9]{1,4})?$

A working example:

接受字符串:

-0.2345
-10
12
.125
0.1245
5.555
-.2
-.421

不接受字符串:

100000000000.0001
+
-

123456789012
1111111111.12345
+1.11.1
-2.

答案 2 :(得分:2)

这个坏男孩怎么样:

^(\+|-)?([0-9]{1,11}?|)(?:\.[0-9]{1,4})?$

似乎工作=)

答案 3 :(得分:2)

我的$ .02

 ^(\+|-)?([0-9]{1,11}|)?(?:\.[0-9]{1,4})?$

答案 4 :(得分:2)

关键字:0仅适用于 POSITIVE 数字。

您需要单独的正面和负面陈述。

^(((\+?[0-9]{0,11})|(-[0-9]{1,11}))(?:\.[0-9]{1,4})*)$

答案 5 :(得分:2)

您可以使用word boundary在正确的位置解决所有问题:

^(?:\+|-\b)?[0-9]{0,11}(?:\.[0-9]{1,4})?\b$
  • {1,11}更改为{0,11}以允许小数点前的零位数。
  • 减去叹息之后
  • \b不会允许紧随其后的小数点。
  • 最后
  • \b不允许"+""-"作为整个字符串。

工作示例(改编自John):http://rubular.com/r/c7YLR25r3i