2

我正在尝试编写一个正则表达式来匹配表示为.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; }

类似的问题(我正在寻找一种将数字的小数部分向上或向下舍入到最接近的 .25、0.5、0.75 或整数的方法)但我需要使用正则表达式来使用上述数据注释。

问题:

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

  2. 如果您可以将其扩展为支持整数(例如4or4.25但不是4.or 4.62) ,则可以加分

4

2 回答 2

1

匹配这样的数字,请使用正则表达式模式

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

验证输入是这样的数字,请使用正则表达式模式

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

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

于 2012-11-15T01:06:54.357 回答
1

这也匹配整数:

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

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

于 2012-11-15T01:16:57.283 回答