正则表达式日期验证:M/D/YYYY和MM/DD/YYYY(InfoPath)

4

我正在寻找一些正则表达式,用于自定义模式验证InfoPath 2010中的日期字段。接受的日期格式为m/d/yyyy或mm/dd/yyyy。

尝试1:(\d{1,2})/(\d{1,2})/(\d{4})

尝试2:(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/((19|20)\d\d)

尝试1取得了更好的效果,而尝试2几乎没有什么效果。


如果第一次尝试成功了,问题在哪里? - Jonah Bishop
如果您想验证日期是否存在,仅使用正则表达式是不够的。请注意。 - djjeck
4
使用正则表达式处理实际日期可能会过于繁琐。要记住,并非所有月份都有29-31日,因此您需要一个巨大的正则表达式来涵盖任何真实可能性。 - Guillermo René Ramírez
“m/dd/yyyy” 是有效的吗? - Walls
如果我只关心日期格式而不关心日期是否真实有效怎么办?我只需要确保只输入d/d/dddd或dd/dd/dddd格式的内容。 - manh2244
显示剩余5条评论
3个回答

4

我在使用 InfoPath 2010 进行日期和时间验证时遇到了一些问题,使用正则表达式模式匹配可以是一种有效的方法。用于验证 m/d/yyyy 格式的基本正则表达式(不考虑月份或日期中特定的天数并允许月份或日期以 '0' 作为前缀)应该类似于以下内容(未经测试):

(0?[1-9]|1[012])\/(0?[1-9]|[12][0-9]|3[01])\/\d{4}

如果您想要更为精细的操作,您可以参考这个 Stack Overflow 的回答

不过,在 InfoPath 中,日期的显示格式与内部格式可以完全不同,而您的正则表达式需要匹配的是这个内部格式。如果您在表单上放置一个计算字段,并将其设置为要验证的日期字段,您会看到类似以下的内容:

2013-05-08T12:13:14

所以,为了验证这个日期组件(再次忽略每月的特定日),需要一个正则表达式:
\d{4}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])

但是这个方法无法匹配示例日期,因为它没有考虑“T”后面的时间部分。所以,技巧是使用表达式只对日期子字符串进行匹配,例如,在我的情况下,以下方法可行:

not(xdUtil:Match(substring-before(dfs:dataFields/my:SharePointListItem_RW/my:DateCreated, "T"), "\d{4}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])"))

0

我遇到了同样的问题。

我在日期字段上使用了一个规则,将另一个隐藏文本字段设置为

string(datefield).

这总是以YYYY-MM-DD的形式呈现,这不太难创建一个正则表达式来匹配。我使用了这个。

((19|20)\d\d)-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])

记住,它必须是有一些限制的 XML 正则表达式。

然后我在隐藏字段上设置了另一个规则,以设置布尔值 IsDateValid。


0
我尝试了以下方法,它有效:
 \d{4}-\d{1,2}-\d{1,2}

正如David所指出的,内部格式可能与显示的格式不同,因为当我尝试使用\d\d/\d\d/\d\d\d\d时,它并没有起作用,即使它符合日期的显示格式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接