Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 完整ISO 8601日期语法的正则表达式_Javascript_Regex_Iso8601 - Fatal编程技术网

Javascript 完整ISO 8601日期语法的正则表达式

Javascript 完整ISO 8601日期语法的正则表达式,javascript,regex,iso8601,Javascript,Regex,Iso8601,更新:目前,已经通过同时使用多个正则表达式实现了一个有效的解决方案 我正在寻找一个正则表达式,它涵盖ISO 8601日期可接受的语法范围。大多数库和正则表达式只包含8601的一个子集或简化版本,如RFC3339,但完整的8601包含表示时间持续时间和间隔的方法。ISO 8601的维基百科条目提供了一个很好的概述,但简而言之,这些都应该是有效日期: var testDates = { 'year' : "2013", 'date' : "2013-01-05",

更新:目前,已经通过同时使用多个正则表达式实现了一个有效的解决方案

我正在寻找一个正则表达式,它涵盖ISO 8601日期可接受的语法范围。大多数库和正则表达式只包含8601的一个子集或简化版本,如RFC3339,但完整的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模式在如何验证某些内容方面提供了一定的灵活性,因为您可以提供多个规则或正则表达式进行测试。在这种情况下,我可以通过使用多个正则表达式而不是一个组合表达式来解决我的问题

更新:到目前为止,通过同时使用多个单独的表达式,这个问题已经得到了解决

如果我要这样做,那么我还没有解决的一个问题是一个以持续时间开始的范围,然后指定持续时间/日期的结束日期范围 前面提到的所有表达式实际上只是两个表达式的不同组合,一个表示日期时间,另一个表示持续时间。 我唯一无法正确验证的是持续时间/日期的范围 以下是脚本:

作为要点: 作为网页:
正则表达式是否是最好/最合适的解决方案

看起来您确实在尝试根据规范解析字符串。看看您尝试过的一些正则表达式有多复杂

我的建议是要么制作更简单的正则表达式,将每个模式与一些if/then代码混合在一起,要么使用/创建一个完整的解析器


请记住,正则表达式是为模式匹配而设计的,而不是为解析而设计的。它们非常适合于从字符串中快速提取值,但不适用于更复杂的事情。

以下是我发现的实现ISO 8601语法多样性的完整表达式集。已使用这些和其他重复间隔测试更新

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模式文档中使用的,因此它意味着只使用一个正则表达式是语言无关的。在这种情况下,我会为每个模式创建一个正则表达式,并告诉读者应用所有模式,而不是一个试图覆盖所有模式且不可读的巨型表达式。拥有一个正则表达式能给你带来6个更小、更容易理解的正则表达式所不能给你的东西吗?幸运的是,JSON模式确实允许您定义多个可能的验证规则,因此我认为我实际上可以在JSON模式的上下文中这样做。在这种情况下,我认为我唯一缺少的正则表达式是在一定范围内正确组合日期和持续时间的正则表达式。我将对此进行研究,并在这里提供更新。我已经更新了说明和要点,以建议这种方法。现在,我只是缺少了一个工作正则表达式,它是两个组合表达式的一个排列,其范围为持续时间/日期。您应该意识到,即使使用那些复杂的正则表达式,也会出现误报。2014-02-31不是一个有效日期,但会匹配,2014-04-31也是如此。有趣的问题,我很想看看你的最终答案。然而,我强烈建议以自由间距模式编写这些非平凡的正则表达式,并使用缩进和注释,这样即使JavaScript不支持x修饰符,也能被普通人阅读。有了JS的no-x-mode-LIMITIONS,我喜欢在实际RegExp文本之前的多行注释中包含详细的正则表达式。我更新了描述,注意到所有这些表达式都是两个表达式的不同组合,一个表示日期,一个表示持续时间,只有on
e当前不起作用的组合。我还更新了要点,引用了这两个表达式的源代码,其中有一些关于它们是如何构造的额外解释。对date regex的修改,它严格捕获了解析日期所需的内容。请注意,24:00并没有被捕获,但它实际上与无时间相同,因此任何解析器都应该对其进行相同的处理/^[\+-]?\d{4}\(2)2[12]3[1-9[1-1-9]3[1[1-9]3[01]存存存存存存存存存存存存于2 0 0 0 0 0 0-2}b??::::::::::0[1-1-2 0 0 0 0 0 0 0 0 0-2)存存存存存存存存存存存存存存存存存存存存存存存存存存于3[1-4[0-4[0-4存存存存存存存存存存存存存存存存存存存存0-4[0-4[0[0-4[0-4存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存5 5 5 5[0-5[0-5[0-4 5[0 0-3[0-0-0 0???:\10[0-5]\d[\,]\d+?[zZ]|[\+-]:[01]\d[124; 2[0-3]:?[0-5]\d$/