在我的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链接中的代码)。
谢谢。
答案 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)