2011-12-21 102 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