Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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 是否使用正则表达式检查有效的日期组合?_Javascript_Regex - Fatal编程技术网

Javascript 是否使用正则表达式检查有效的日期组合?

Javascript 是否使用正则表达式检查有效的日期组合?,javascript,regex,Javascript,Regex,用户可以在输入中输入几个有效的日期组合: 示例:(所有组合都允许3!=6) 所有日期均为有效日期 我还创建了一个正则表达式,用于检查: /^(?=.*\b(一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月)(?=.*‌2] \d{3}\b))(?=.*\b(0[1-9]|[12]\d|3[01])\b)。*$/i 这意味着: (?=..*\b(1月| 2月| 3月| 4月| 5月| 6月| 7月| 8月| 9月| 10月| 11月| 12月):我期待未来会有这样的一个

用户可以在输入中输入几个有效的日期组合:

示例:(所有组合都允许3!=6)

所有日期均为有效日期

我还创建了一个正则表达式,用于检查:

/^(?=.*\b(一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月)(?=.*‌2] \d{3}\b))(?=.*\b(0[1-9]|[12]\d|3[01])\b)。*$/i

这意味着:

  • (?=..*\b(1月| 2月| 3月| 4月| 5月| 6月| 7月| 8月| 9月| 10月| 11月| 12月)
    :我期待未来会有这样的一个值
  • (?=.*)(\b[1‌2] \d{3}\b))
    :我预期的年份:1xx或2xxx
  • (?=..*\b(0[1-9]|[12]\d|3[01])\b)
    我期待的日子:0x或1x或2x或3x
一切都好

那么问题出在哪里呢

My regex还匹配了一个无效的解决方案,其中包括一个有效的解决方案:

IE:
2012年2月13日4
也将通过

Console : 

/^(?=.*\b(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)\b)(?=.*(\b[1‌2]\d{3}\b))(?=.*\b(0[1-9]|[12]\d|3[01])\b).*$/i.test('feb 13 2012 4') //true
问题:

如何增强我的正则表达式以找到严格匹配

p、 美国。
检查新日期(xxx)也是一个解决方案,但我正在寻找正则表达式解决方案。(以提高我的正则表达式技能)。

为每种格式编写一个正则表达式:

  • RE1-识别
    MON DD YYYY
    =
    (?:一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月)s+(?:0?[1-9]|[12]\d | 3[01])\s+[12]\d{3}
  • RE2-识别
    DD MON yyyyy
    =
    (?:0?[1-9]|[12]\d | 3[01])\s+(?:一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月|)s+[12]\d{3}
  • RE3-识别
    YYYY-DD-MON
    =
    [12]\d{3}\s+(?:0?[1-9]|[12]\d|3[01])\s+(?:一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月)
然后将它们结合起来:

/^(?:RE1|RE2|RE3)$/i

为每种格式编写一个regexp:

  • RE1-识别
    MON DD YYYY
    =
    (?:一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月)s+(?:0?[1-9]|[12]\d | 3[01])\s+[12]\d{3}
  • RE2-识别
    DD MON yyyyy
    =
    (?:0?[1-9]|[12]\d | 3[01])\s+(?:一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月|)s+[12]\d{3}
  • RE3-识别
    YYYY-DD-MON
    =
    [12]\d{3}\s+(?:0?[1-9]|[12]\d|3[01])\s+(?:一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月)
然后将它们结合起来:

/^(?:RE1|RE2|RE3)$/i

在开始处创建一个前瞻
(?=…)
组,然后为月份块之前或之后的数字创建可选组。下面的正则表达式适用于所有示例(请参见链接页面上的单元测试)编辑:它现在匹配所有3个=6允许的组合,但不允许出现不允许的组合,如
2 1978年2月4

/^(?=[a-z]{3}\s(\d{1,2}\s\d{4}|\d{4}\s\d{1,2})$|\d{1,2}\s[a-z]{3}\s\d{4}$|\d{4}\s[a-z]{3}\s\d{1,2}$|(\d{1,2}\s\d{4}|\d{4}\s\d{1,2})\s[a-z]{3}$)([12]\d{3}\s|\d{1,2}\s){0,2}(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(\s\d{1,2}|\s[12]\d{3}){0,2}$/i

说明:

  • 整个表达式必须类似于以下表达式之一:
    • 三个
      [a-z]
      之后是一天,然后是一年
    • 三个
      [a-z]
      之后是一年,然后是一天
    • 一天,三天,一年
    • 一年,三年,一天
    • 一天,一年,然后是三天
    • 一年,一天,然后是三年
  • (可选)匹配一个或两个数字组
  • 匹配三个字母的月份代码
  • (可选)匹配一个或两个数字组

在开头创建一个前瞻
(?=…)
组,然后在月份块之前或之后为数字创建可选组。下面的正则表达式适用于所有示例(请参见链接页面上的单元测试)编辑:它现在匹配所有3个=6允许的组合,但不允许出现不允许的组合,如
2 1978年2月4

/^(?=[a-z]{3}\s(\d{1,2}\s\d{4}|\d{4}\s\d{1,2})$|\d{1,2}\s[a-z]{3}\s\d{4}$|\d{4}\s[a-z]{3}\s\d{1,2}$|(\d{1,2}\s\d{4}|\d{4}\s\d{1,2})\s[a-z]{3}$)([12]\d{3}\s|\d{1,2}\s){0,2}(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(\s\d{1,2}|\s[12]\d{3}){0,2}$/i

说明:

  • 整个表达式必须类似于以下表达式之一:
    • 三个
      [a-z]
      之后是一天,然后是一年
    • 三个
      [a-z]
      之后是一年,然后是一天
    • 一天,三天,一年
    • 一年,三年,一天
    • 一天,一年,然后是三天
    • 一年,一天,然后是三年
  • (可选)匹配一个或两个数字组
  • 匹配三个字母的月份代码
  • (可选)匹配一个或两个数字组

您使用什么代码来执行表达式匹配?@norlesh仅使用控制台:
/^(?=.*\b(一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|)十二月)(?=.*‌2] \d{3}\b](?=.*\b(0[1-9]|[12]\d|3[01])\b.*$/i.test('feb 13 2012 4')
而不是试图将所有不同的格式混合到一个regexp中,为每种格式制作一个单独的regexp,然后交替组合。@Barmar要求一个示例会不会很粗鲁?:-)在
$
之前最后一个
*
在那里做什么?我希望这就是让尾随内容通过的原因,但我无法让表达式在没有它的情况下通过任何内容。您使用什么代码来执行表达式匹配?@norlesh仅使用控制台:
/^(?=.*\b(一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|)\b)(?=.*‌2] \d{3}\b](?=.*\b(0[1-9]|[12]\d|3[01])\b.*$/i.test('feb 13 2012 4')
而不是试图将所有不同的格式混合到一个regexp中,为每种格式制作一个单独的regexp,然后交替组合。@Barmar要求一个示例会不会很粗鲁?:-)在
$
之前最后一个
*
在那里做什么?我想这就是让尾随的东西通过的原因,但是如果没有它,我无法得到表达式让任何东西通过,除非你想允许每一个排列。我的解决方案只允许您列出的3种排列,例如,它不允许
MON-YYYY-DD
。仅当您希望允许每种排列时。我的解决方案只允许您列出的3种排列,例如,它不允许
MON-YYYY-DD
。您的解决方案还匹配
2 1978-feb-3
@sp00m-Oops;忘记粘贴