更新:目前,我们已成功地使用多个正则表达式同时解决了问题。
我正在寻找一种正则表达式,它涵盖了ISO 8601日期可接受语法的范围。大多数库和正则表达式只覆盖ISO 8601的一个子集或“简化”版本,如RFC 3339,但完整的ISO 8601包括表达时间持续和间隔的方法。维基百科对ISO 8601的条目提供了很好的概述,但简而言之,以下所有内容都应该是有效的日期:
我正在尝试构建一个正则表达式,以涵盖所有这些可能性。我已经组合了一些组件,但是我对正则表达式的技能不足,无法将它们作为一个表达式工作,并覆盖所有可能的情况。仅简单地在这些表达式之间进行“OR”似乎不能按预期工作,但也许我没有做得完全正确。
我尝试的表达式包括以下内容:
我已经编写了一个示例脚本,尝试对上述列出的每个日期运用这些表达式,但如果有人能够指导如何将所有这些情况组合到一个表达式中,那将非常感激。
推动这一使用案例的是验证JSON模式文档的ISO 8601日期。 JSON Schema在验证内容方面提供了一定的灵活性,您可以提供多个规则或正则表达式进行测试。在这种情况下,我可以通过使用多个正则表达式而不是一个组合表达式来解决我的问题。
更新:目前已经通过使用这种方法(同时使用多个单独的表达式)解决了问题。
以下是脚本:
我正在寻找一种正则表达式,它涵盖了ISO 8601日期可接受语法的范围。大多数库和正则表达式只覆盖ISO 8601的一个子集或“简化”版本,如RFC 3339,但完整的ISO 8601包括表达时间持续和间隔的方法。维基百科对ISO 8601的条目提供了很好的概述,但简而言之,以下所有内容都应该是有效的日期:
var testDates = {
'year' : "2013",
'date' : "2013-01-05",
'datetime' : "2013-01-05T04:13:00+00:00",
'Duration only' : "P1Y2M10DT2H30M",
'Week Duration' : "P1W",
'Range with start and end' : "2007-03-01T13:00:00Z/2008-05-11T15:30:00Z",
'Range of Date/Duration' : "2007-03-01T13:00:00Z/P1Y2M10DT2H30M",
'Range of Date/Duration 1 month' : "2012-10/P1M",
'Range of Date/Duration 1 week' : "2012-10/P1W",
'Range of Duration/Date' : "P1Y2M10DT2H30M/2007-03-01T13:00:00Z",
'Repeating interval 5 times' : "R5/2007-03-01T13:00:00Z/P1Y2M10DT2H30M",
'Repeating interval weekly indefinitely' : "R/2012-10/P1W",
'Repeating interval monthly 5 times' : "R5/2012-10/P1M"
}
我正在尝试构建一个正则表达式,以涵盖所有这些可能性。我已经组合了一些组件,但是我对正则表达式的技能不足,无法将它们作为一个表达式工作,并覆盖所有可能的情况。仅简单地在这些表达式之间进行“OR”似乎不能按预期工作,但也许我没有做得完全正确。
我尝试的表达式包括以下内容:
var regex = {
'Date' : /^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/,
'Duration' : /^P(?=\w*\d)(?:\d+Y|Y)?(?:\d+M|M)?(?:\d+W|W)?(?:\d+D|D)?(?:T(?:\d+H|H)?(?:\d+M|M)?(?:\d+(?:\.\d{1,2})?S|S)?)?$/,
'Range of Date/Date' : /^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?(\/)([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/,
'Range of Date/Duration' : /^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?(\/)P(?=\w*\d)(?:\d+Y|Y)?(?:\d+M|M)?(?:\d+W|W)?(?:\d+D|D)?(?:T(?:\d+H|H)?(?:\d+M|M)?(?:\d+(?:\.\d{1,2})?S|S)?)?$/,
'Range of Duration/Date' : /^P(?=\w*\d)(?:\d+Y|Y)?(?:\d+M|M)?(?:\d+W|W)?(?:\d+D|D)?(?:T(?:\d+H|H)?(?:\d+M|M)?(?:\d+(?:\.\d{1,2})?S|S)?)?\/([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/,
'Repeating interval' : /^R\d*\/([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?\/P(?=\w*\d)(?:\d+Y|Y)?(?:\d+M|M)?(?:\d+W|W)?(?:\d+D|D)?(?:T(?:\d+H|H)?(?:\d+M|M)?(?:\d+(?:\.\d{1,2})?S|S)?)?$/
}
我已经编写了一个示例脚本,尝试对上述列出的每个日期运用这些表达式,但如果有人能够指导如何将所有这些情况组合到一个表达式中,那将非常感激。
推动这一使用案例的是验证JSON模式文档的ISO 8601日期。 JSON Schema在验证内容方面提供了一定的灵活性,您可以提供多个规则或正则表达式进行测试。在这种情况下,我可以通过使用多个正则表达式而不是一个组合表达式来解决我的问题。
更新:目前已经通过使用这种方法(同时使用多个单独的表达式)解决了问题。
以下是脚本: