RegEx模型验证:.25的整数或十进制倍数

时间:2012-11-15 00:59:58

标签: c# regex entity-framework attributes data-annotations

我正在尝试使用正则表达式来匹配表示为.25的十进制倍数的数值(例如1.2514.75)。

// Must Match
1.0
1.25
1.250000
1.5
1.500
1.75
1.7500

// Must Not Match
1.2
1.46
1.501
1.99

到目前为止,我有以下表达式:\d+(\.((0+)|(250*)|(50*)|(750*)))。当我使用gskinner.com/regexr等在线工具时,它可以正常工作。当我使用验证属性中的表达式来为我的EntityFramework数据库生成种子时,它会产生验证错误:

[RegularExpression(@"^\d+(\.((0+)|(250*)|(50*)|(750*)))$", ErrorMessage = "Hours must be 15 minute increments expressed as decimals (ex. .0, .25, .5, .75)")]
public double Hours { get; set; }

类似的问题(I am looking for a way to round the decimal portion of numbers up or down to the nearest .25, .5, .75, or whole number)但我需要使用正则表达式来使用上面的数据注释。

问题:

  1. 有人看到我的表情有什么问题吗?

  2. 奖励积分,如果您可以将其扩展为支持整数(例如44.25但不4.4.62

    < / LI>

2 个答案:

答案 0 :(得分:1)

匹配此类号码使用正则表达式

 (?!0\d)\d+(?:[.](?:25|5|75|0)0*)?(?!\d)

验证输入为此号码,请使用正则表达式

 ^(?!0\d)\d+(?:[.](?:25|5|75|0)0*)?$

在这两种情况下,第一部分(?!0\d)是可选的,以禁止匹配/验证数字与无效的前导零,例如000003.250,当匹配将修剪它们并仅采用3.250 ;如果正则表达式中存在此可选部分,验证将失败。

答案 1 :(得分:1)

这也符合整数:

^\d+(\.(25|5|75|0)0*)?$

我用RegexHero测试了它。它在后台有一个.NET Regex引擎。如果您同时使用所有测试用例,请确保选中Multiline选项,以便^$符号分别与每一行匹配,而不是整个文本。< / p>