2011-12-21 115 views
2

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

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

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

我将不胜感激,如果有人能帮助我用正则表达式将匹配任何以上的,当然不匹配其他任何东西。

我一直在尝试了几个小时,而不是在任何地方获得:■

UPDATE响应提供的答案:

非常感谢你的家伙,我希望我是不如你很多在建立RegExes!由于我的应用程序是使用ASP.net MVC3,我想坚持.NET RegEx类(为了方便起见)。

luastoned答案似乎工作!我似乎无法打破它所有的测试数据。

但有一件事,我可以让BC吗?导致一些人使用BC和其他人使用BCE <会是可能的吗?而且......我说对了,正则表达式不能用BCE代替BC吗?我必须通过我的C#代码手动执行该操作吗?正则表达式只会匹配或不正确。

更新两个:

M42的正则表达式似乎是更好的工作。我刚刚复制了它并将其用于我的Custom Validator(下面的PasteBin链接中的代码)。

谢谢。

回答

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 
1

这个看起来喜欢我所做过最奇怪的正则表达式:

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

我不知道有多少误报会怎样度过,但..

您可以检查Regexr样本

+0

为什么'(BCE | \ d {4} )?'? (BCE)“应该是足够的,因为”BCE“是最后一个(OP中的例子分别是”1809“,”1809“,”341“,”341“,”341“和”5“是BCE。) – jensgram 2011-12-21 10:03:51

+0

你是对的 - 修好了,谢谢。 – luastoned 2011-12-21 10:06:34

+1

符合:'“”' - 包含单个空格的字符串。表达式还应该有'^'和'$'锚点。 – ridgerunner 2011-12-21 17:27:00

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