RegEx字符串验证器

时间:2011-12-21 09:48:47

标签: regex asp.net-mvc-3 validation

在我的MVC3应用程序中,我将其中一个实体保存为出生日期为字符串。为什么?因为我的申请允许存储长期死亡的人的出生日期,例如。苏格拉底,柏拉图,伊壁鸠鲁等等,据我所知,DateTime类不允许这样做。

现在显然我们不知道伊壁鸠鲁的确切出生日期,例如,我们只知道出生年份[341 BCE],所以我想要做的是建立一个自定义验证器,它将验证输入出生日期的字符串,并确保它们都符合以下格式:

12 Feb 1809
Feb 1809
341
341 BCE
Oct 341 BCE
11 Mar 5 BCE

如果有人可以帮助我使用符合上述任何条件的正则表达式,我将不胜感激,当然也不能与其他任何内容相匹配。

我已经尝试了几个小时,而且没有到达任何地方:s

响应提供的答案的最新消息:

非常感谢你们,我希望在建立RegExes时我和你们一样好!由于我的应用程序是ASP.net MVC3,我想坚持使用.NET RegEx类(为了方便起见)。

luastoned回答似乎有效!!我似乎无法用我抛出的所有测试数据来打破它的逻辑。

但有一件事我可以允许BC吗?导致一些人使用BC而其他人使用BCE<那有可能吗?并且..我是正确的,正则表达式不能用BCE取代BC吗?我必须通过我的C#代码手动执行此操作吗? RegEx只会匹配还是不正确?

更新二:

M42的正则表达似乎效果更好。我刚刚复制了它并在我的自定义验证器中使用它(下面的PasteBin链接中的代码)。

谢谢。

3 个答案:

答案 0 :(得分:1)

这看起来像是我做过的最奇怪的正则表达式:

(\d+\s?)?(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)?\s(\d+\s)?(BCE)?

我不知道有多少误报可以通过..

您可以在Regexr

上查看示例

答案 1 :(得分:1)

怎么样:

/^(?:\d+\s)?(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)?(?:\s?\d+)(?:\sBCE)?$/

这是一个包含测试用例的perl脚本:

#!/usr/local/bin/perl 
use strict;
use warnings;
use Test::More;

my $re1 = qr/^(?:\d+\s)?(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)?(?:\s?\d+)(?:\sBCE)?$/;
while(<DATA>) {
    chomp;
    if (/$re1/) {
        ok(1, "input = $_");
    } else {
        ok(0, "input = $_");
    }
}
done_testing;

__DATA__
12 Feb 1809
Feb 1809
341
341 BCE
Oct 341 BCE
11 Mar 5 BCE
12D09
1s909
A3 43 4 BCE
a 1
3F9

abc
BCE
123b456

<强>输出:

# Looks like you failed 9 tests of 15.
ok 1 - input = 12 Feb 1809
ok 2 - input = Feb 1809
ok 3 - input = 341
ok 4 - input = 341 BCE
ok 5 - input = Oct 341 BCE
ok 6 - input = 11 Mar 5 BCE
not ok 7 - input = 12D09
not ok 8 - input = 1s909
not ok 9 - input = A3 43 4 BCE
not ok 10 - input = a 1
not ok 11 - input = 3F9
not ok 12 - input = 
not ok 13 - input = abc
not ok 14 - input = BCE
not ok 15 - input = 123b456

答案 2 :(得分:0)

不是RegExr的朋友(并且不知道MVC3中正则表达式的限制),请允许我提供带有命名捕获(demo)的PHP版本:

(?:(?:(?P<date>\d{1,2})\s)?(?P<month>Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))?(?:(?:^|\s)(?P<year>\d+))?(?:\s(?P<bce>BCE))?

这是基于@ luastoned的answer