所需的结果是正输入的模式,它不会在>>> 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.
我喜欢这个answer(01
01.2
.
1.B
A.2
A
A.
)中的模式;但不知何故(如评论中所述),它接受-?(0|([1-9]\d*))(\.\d+)?
(仅限X.2
)和负小数,并拒绝Regex.IsMatch
;所以我将其修改为1.
,它在regexr.com和RegExr v1中完美运行;但我对/((0|([1-9]\d*))(\.\d*)?)|(\.\d+)/g
没有好运。
有什么建议吗?为什么这个模式在Regex.IsMatch
工作的时候不适用于其他地方?
答案 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
答案 2 :(得分:0)
我想这个简单的正则表达式应该能很好地完成这项工作/-?(0?\.\d+|[1-9]\d*\.?\d*)/g
你还没有要求它,但它也处理了负面因素。如果不需要,只需删除开头的-?
,使其更加简单。