decimal.Parse中接受的小数的正则表达式

时间:2016-04-02 14:22:36

标签: c# regex search text decimal

所需的结果是正输入的模式,它不会在>>> from datetime import datetime, time, timedelta >>> import random >>> now = datetime.now() >>> midnight = datetime.combine(now.date(), time.min) >>> delta = int((now - midnight).total_seconds()) >>> midnight + timedelta(seconds=random.randrange(delta)) datetime.datetime(2016, 4, 2, 2, 11, 11) >>> midnight + timedelta(seconds=random.randrange(delta)) datetime.datetime(2016, 4, 2, 0, 45, 35) >>> midnight + timedelta(seconds=random.randrange(delta)) datetime.datetime(2016, 4, 2, 5, 56, 58) >>> midnight + timedelta(seconds=random.randrange(delta)) datetime.datetime(2016, 4, 2, 4, 35, 47) >>> midnight + timedelta(seconds=random.randrange(delta)) datetime.datetime(2016, 4, 2, 2, 10, 1) 中引发异常,也不接受decimal.Parse - 类似模型的输入。

有效输入:

01

输入无效:

1
1.2
.2
1.

我喜欢这个answer01 01.2 . 1.B A.2 A A. )中的模式;但不知何故(如评论中所述),它接受-?(0|([1-9]\d*))(\.\d+)?(仅限X.2)和负小数,并拒绝Regex.IsMatch;所以我将其修改为1.,它在regexr.comRegExr v1中完美运行;但我对/((0|([1-9]\d*))(\.\d*)?)|(\.\d+)/g没有好运。

有什么建议吗?为什么这个模式在Regex.IsMatch工作的时候不适用于其他地方?

3 个答案:

答案 0 :(得分:2)

这会通过所有测试:

var reg = new Regex("^(([1-9]*[0-9](\\.|(\\.[0-9]*)?))|(\\.[0-9]+))$");

(reg.IsMatch("1") == true).Dump();
(reg.IsMatch("1.2") == true).Dump();
(reg.IsMatch(".2") == true).Dump();
(reg.IsMatch("1.") == true).Dump();

(reg.IsMatch("01") == false).Dump();
(reg.IsMatch("01.2") == false).Dump();
(reg.IsMatch(".") == false).Dump();
(reg.IsMatch("1.B") == false).Dump();
(reg.IsMatch("A.2") == false).Dump();
(reg.IsMatch("A") == false).Dump();
(reg.IsMatch("A.") == false).Dump();

说明:

我们尝试尽可能多地捕获1-9个数字。这排除了领先的0。然后我们允许小数点前的任何数字。

然后我们有三种情况:无小数点,小数点,跟随数字的小数点。

否则,如果我们以小数点开头,我们允许任何数字,但至少有一个数字。这不包括.

答案 1 :(得分:0)

你必须在开头删除'/'字符。因为正则表达式的语法是在Javascript / ECMAScript中指定正则表达式的开头而不是c#。(参考:What does the forward slash mean within a JavaScript regular expression?)因此,最终的正则表达式是

((0|([1-9]\d*))(\.\d*)?)|(\.\d+)/g

enter image description here

答案 2 :(得分:0)

我想这个简单的正则表达式应该能很好地完成这项工作/-?(0?\.\d+|[1-9]\d*\.?\d*)/g

你还没有要求它,但它也处理了负面因素。如果不需要,只需删除开头的-?,使其更加简单。