2013-05-22 34 views
0

我想知道日期dd-mm-yyyy格式的正则表达式。并且规则是什么是XML正则表达式中DD-MM-YYYY日期格式的正则表达式?

如果月份是4,6,9或11之一,月日值不得超过30,如果月份是2且年份是月份,则不会超过28不能被4整除,或者可以被100除尽而不能被400整除,并且如果·月·是2并且·年·可被400整除或由4整除但不能被100整除。

我想在xsd中做xml正则表达式。

Accept-- 29-02-2000, 31-05-2013, 30-04-2012

Reject-- 29-02-1900, 31-04-2013, 30-02-2000

+11

为什么你会使用正则表达式来解决这个问题? –

+1

为什么不试试解析并拒绝,如果它不起作用 –

+0

正则表达式不是解决这个问题的正确工具。 – StuffHappens

回答

5

我其实是有这个表达式躺在身边,我做了一段时间回来与我的一个朋友竞争!

以下是我朋友的,而约20%的速度:

^(?!00)((([0-2]\d|3[01])-(0[13578]|1[02])|([0-2]\d|30)-(0[469]|11)|([01]\d|2[0-8])-02)-\d{4}|([01]\d|2\d)-02-(([02468][048]|[13579][26])(?=00)|\d{2}(?!00))([02468][048]|[13579][26]))$ 

虽然这一个是(适合在Twitter上,这是我的挑战)最短:

^(?!(00|30-02))(((?=.+(?!00)([02468](?=[048](00)?$)|[13579](?=[26](00)?$)))|(?!29-02))[012]\d|30|31(?!-(0[2469]|11)))-(0[1-9]|1[012])-\d{4}$ 

注意,这两个根据公历日历,正规表达式将无法验证yyyy = 0000,这不是一个有效的年份。

这两个正则表达式都没有向后看和条件,因为它必须在javascript中工作。

编辑:

既然你需要这个XML,我已经修改了第一个正则表达式了一下,只需要稍作修改,以摆脱环视的。

((0[1-9]|[1-2]\d|3[01])-(0[13578]|1[02])|([0-2]\d|30)-(0[469]|11)|(0[1-9]|1\d|2[0-8])-02)-\d{4}|(0[1-9]|[12]\d)-02-(([02468][048]|[13579][26])00|(\d{2}([02468][48]|[2468][048]|[13579][26]))) 

我希望这对你有效。

+0

谢谢@melwil。但我需要在XML正则表达式中完成。 – Sai

+0

W3C XML风格太有限,无法对所有日期进行精确验证。几乎不可能找到迂回年龄的人,因为几乎不可能,至少我不想考虑这个长度。验证应该由创建这个XML的程序来完成,因为XML并不是用来验证数据,而只是代表它。 – melwil

+0

我决定尝试。结果比我想象的要容易。我会更新答案。 – melwil

1

您应该验证日期用下面的代码,而不是一个正则表达式:

DateTime temp; 
if(DateTime.TryParse(dateTextBox.Text, out temp)) 
// valid date 
else 
// invalid date