数据注释正则表达式以检查特定数字之间的数字

时间:2012-08-15 05:55:32

标签: regex asp.net-mvc-3

如何编写包含 00:00

等格式的正则表达式 之前的 00:必须在0-24到 00之间为数字:必须在0-59之间为数字

我的代码如下,但有些情况下它无法正常工作。

[RegularExpression(@"[0-24]+:[0-59]", ErrorMessage = "Format was invalid")]

对于Exmaple

00:59被接受

25:60未被接受

4 个答案:

答案 0 :(得分:2)

这样简单的事情怎么样?

[RegularExpression(@"(([0-1]?[0-9])|([2][0-3])):([0-5]?[0-9])", ErrorMessage = "Format was invalid")]

它可以在00:0023:59的任何时间匹配。请注意,它不需要写入的前导零,因此在7点之前的三分钟也会接受7:007:3之类的时间(这与您提出问题的方式一致)。

如果您希望它需要前导零,只需删除问号...

答案 1 :(得分:1)

试试这个"([0-9]{1,2}|100):(1?[0-9]{1,2}|200)"

答案 2 :(得分:1)

试试这个:\b(?:2[0-4]|1?\d):(?:5\d|[1-4]?\d)\b

带前导零:
\b(?:2[0-4]|1\d|0?\d):(?:5\d|[1-4]\d|0?\d)\b

答案 3 :(得分:0)

为什么你需要通过REGEX解决所有问题。你不应该使事情复杂化。打破代码。这会使你的代码更具可读性和流畅性。

下面的方法可以产生完美的匹配。

 public IEnumerable<string> getValues(string s)//this method returns the valid matches from s
    {
        Regex r=new Regex(@"\d{1,}:\d{1,}");
        foreach(Match m in r.Matches(s))
        {
        string[] str=m.Value.Split(':');

        if((int.Parse(str[0])>=0 && int.Parse(str[0])<=24) && (int.Parse(str[1])>=0&&int.Parse(str[1])<=59))
        yield return str[0]+":"+str[1];
        }
    }

使用for-each语句使用上述方法!

foreach(string s in getValues("5:16 100:200"))//getValues method yields the perfect match
Console.WriteLine(s);//5:16