C# 正则表达式对于数值几乎是完美的

C# 正则表达式对于数值几乎是完美的,c#,regex,C#,Regex,我有一个几乎完美的正则表达式。。。它似乎可以处理所有的事情,除了一个以负号开头然后是小数的数字。因此,如果我进入: -.2 我得到一个错误- 这是我的正则表达式--我测试过的其他所有东西都非常有效 ^(\+|-)?[0-9]{1,11}?(?:\.[0-9]{1,4})?$ 这允许: 最多11位数字(990亿) 正数还是负数 最多4位小数(可选) 小数点前的前导0是可选的-仅适用于正数 这些都是有效的: -0.2345 -10 12 .125 0.1245 5.555 250000000

我有一个几乎完美的正则表达式。。。它似乎可以处理所有的事情,除了一个以负号开头然后是小数的数字。因此,如果我进入:

-.2
我得到一个错误-

这是我的正则表达式--我测试过的其他所有东西都非常有效

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

  • 最多11位数字(990亿)
  • 正数还是负数
  • 最多4位小数(可选)
  • 小数点前的前导0是可选的-仅适用于正数
这些都是有效的:

-0.2345
-10
12
.125
0.1245
5.555
25000000000 (aka 25 Billion)
25000000000.25 
这些方法不起作用:

-.2
-.421
试试这个:

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

^(\+|-)?(?=.{1})[0-9]{0,11}(?:\.[0-9]{1,4})?$
上面的正则表达式接受字符串
+
-
(空字符串)。您可以使用前瞻来限制这些。向前看确保
+
-
符号后面必须有一个字符

正确的解决方案是:

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

接受的字符串:

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

123456789012
1111111111.12345
+1.11.1
-2.
不接受字符串:

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

123456789012
1111111111.12345
+1.11.1
-2.

这个坏男孩怎么样:

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

我的$0.02

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

关键字:0仅对正数可选

你需要为正面和负面分别陈述

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

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

您当前的实现将永远无法使用备用数字样式,如European where。(点)和(逗号)互换…而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.

数值解析对于regex,IMO来说不是一个好的应用程序。

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

^(?:\+|-\b)?[0-9]{0,11}(?:\.[0-9]{1,4})?\b$
  • {1,11}
    更改为
    {0,11}
    ,允许小数点前有零位
  • \b
    减号叹息后不允许紧靠其旁边的小数点
  • 结尾的
    \b
    不允许将
    “+”
    “-”
    作为整个字符串


工作示例(改编自John):

@JohnBupit-
.125
在他的工作列表中,但它不能:
“.125”。match(/^(\+-)?[0-9]{.1,11})(?:\.[0-9]{.1,4})$/)
另一个bug?
10000000000.0001
合法吗?@Hogan-不。。。我不想超过1000亿。谢谢大家。。。有人发布了以下内容,然后将其删除。。。(而且它似乎工作得很好!!多亏了神秘助手。我把它投入了制作并继续下一期…多亏大家的快速而精彩的回复!!:^(\+\-)?\。?[0-9]{1,11}(?:\.[0-9]{1,4}$)@DanB-这个答案是错误的,它将允许使用像
.2.2
这样的非法数字,这就是他删除它的原因(我的评论)。请使用John的答案或我的答案。它们仍然不会限制在1000亿以下,但它们更好。
**
是什么意思?我以前从未见过。或者这是一种加粗的尝试?不能在代码块中格式化文本。@Bobson-我认为这是为了显示更改,但在正则表达式中,它在预览。我将删除它们不,不是。在
{0,11}
处更改。使用提供的数据,这似乎在regexpal.com上正常工作。这是否匹配
-a.24
?(我没有测试它)
[0-9]
限制为数字。哦,我知道我哪里读错了。
是“或无”,而不是“或任何”。为什么
“|”)是“
(“或者什么都没有”)后面跟着
“?”
(0或1),因为它们实际上在做相同的事情?而且,我认为如果您将
“{1,11}”更改为
“{0,11}”
,您可以同时删除
“?”
,那么最终结果将是:
^(\+-)([0-9]{0,11})(?:[0-9]{1,4})?$
@KevinFegan-试试看。有人发布了下面的内容,然后马上删除了它——它似乎工作得很好……我想给他点表扬,但他的答案不见了……^(\+-)?\.[0-9]{1,11}.(?:\[0-9]{1,4})?$您接受的答案不会强制在负数的小数点前加0。此正则表达式现在可以正确工作。由于@Hogan,我发现答案不太正确…它允许2个小数点…我接受了来自“John Bupit”的答案"... 看起来很完美。。。由于截止日期,没有时间测试休息。。。。但是谢谢你的帮助!哪个表达式允许两个小数点?我的表达式不允许也仍然是这里唯一一个不允许带前导0的负数的表达式。您的答案也比正则表达式更容易理解,因此代码更容易理解maintain@enorl76-如果用户输入45889.33,然后我使用“Decimal.Parse(stringValue,french_culture)”,会发生什么在这种情况下,这不是一个错误吗??我需要像Decimal.TryParse()这样的东西吗??(我不关心这个在欧洲使用的例子,但我想知道我自己的教益。@DanB:如果当前的文化是en-US,那么用户的输入将是正确的。如果当前的文化是fr-fr,那么“45.889,33”也将是正确的输入。如果您想要“验证”然后是的,Decimal.TryParse将通知您当前区域性的数字格式规范的有效性。