Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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
Regex 用于捕获不同日期格式的正则表达式_Regex_Date - Fatal编程技术网

Regex 用于捕获不同日期格式的正则表达式

Regex 用于捕获不同日期格式的正则表达式,regex,date,Regex,Date,我的任务是在电子邮件中捕获行程的日期,但给出的日期都是不同的格式,我想我需要帮助以了解是否有任何方法可以捕获以下格式: 02 APR APR 02 2 APR APR 2 2nd APR APR 2nd 2nd April April 2nd APR 12th April 12th 12th April April 13-16 13-16 April APR 13-16 13-16 APR April 13th-16th 13th-16th April APR 13th-16th 13th-16

我的任务是在电子邮件中捕获行程的日期,但给出的日期都是不同的格式,我想我需要帮助以了解是否有任何方法可以捕获以下格式:

02 APR
APR 02
2 APR
APR 2
2nd APR
APR 2nd
2nd April
April 2nd
APR 12th
April 12th
12th April
April 13-16
13-16 April
APR 13-16
13-16 APR
April 13th-16th
13th-16th April
APR 13th-16th
13th-16th APR
我尝试了很多方法,但就是无法理解或理解,因为我是一个 新手到regex

我能得到的最接近的结果就是使用这个:

(\d*)-(\d*) APR|April \d*\d*
编辑-发现我错过了更多的格式

4月13日至16日

4月13日至16日

4月13日至16日

我试过使用以下方法:

(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\ *\d+(?:[nr]d|th|st)?(?: * \d+(?:[nr]d|th|st)?)?|\d+(?:[nr]d|th|st)?(?: . \d+(?:[nr]d|th|st)?)?\ *(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)
可以捕获有空格或没有空格的日期。 是否有一种方法可以捕获所有格式,并将日期与'-'、'/'、'~'和输出/写入拆分为一种标准格式

(Group 1 Date)-Month (Group 2 Date)-Month eg: 13-Apr 16-Apr

感谢您的建议和评论。

您需要考虑可选值。以下是与示例输入匹配的增强版本:

/(\d+)(?:st|[nr]d|th)?-?(\d*)(?:st|[nr]d|th)?\s*Apr(?:il)?|Apr(?:il)?\s*(\d+)(?:st|[nr]d|th)?-?(\d*)(?:st|[nr]d|th)?/i
请参阅(注意,您需要使用不区分大小写的修饰符来匹配
April
的任何变体)

基本上,有两个备选方案匹配四月和日期范围:

  • (\d+)(:st |[nr]d | th)-?(\d*)(?:st |[nr]d | th)\s*Apr(?:il)
    -1+位,后跟可选的
    st
    nd
    th
    ,后跟可选的连字符,后跟0+位,后跟可选的
    st
    ,etc.后跟0+空格,然后是
    Apr
    April
    (由于
    /i
    修饰符,不区分大小写)
  • |
    -或
  • Apr(?:il)?\s*(\d+)(:st|[nr]d|th)?-(\d*)(?:st|[nr]d|th)?
    -与上述相同,但已交换
    • 我想到了这个:

      (\d+(?:th|st|[nr]d)?(?:-\d+(?:th|st|[nr]d)?)?\s*(?:APR|April))|((?:APR|April)\s*\d+(?:th|st|[nr]d)?(?:-\d+(?:th|st|[nr]d)?)?)
      

      我想出了这个正则表达式:

      (?:APR | April)\*\d+(?:[nr]d | th | st)(?:-\d+(?:[nr]d | th | st))(?:[nr]d | th | st)(?:-\d+(?:[nr]d | th | st)))\*(?:April |
      
      详情如下:


      也许这太过分了,但我想出了一个可以与任何月份匹配的正则表达式:

      (代码)目前,<代码:(()代码:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::th | st)(?:-\d+(?:[nr]d | th | st))*(?:一月|一月|二月|二月|三月|三月|四月|四月|五月|六月|六月|七月|八月|九月|九月|十月|十月|十一月|十一月|十二月|) 无法阅读,如果需要详细信息,请检查此处:


      使用Wiktor Stribiżew的技巧改进版本:

      <代码>(<代码><代码><<代码><代码><代码><代码><代码><代码><代码>((:代码>>(:代码><代码><代码><代码::(:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:日:月:军:月:日)月:月:年月:月:月:月:月:月:月:月:月:日:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月:月月、二月、三月、四月、五月、六月、七月、八月、九月十月份?十一月?十二月 请参见此处的详细信息:
      它每个月匹配一次,使用的步骤更少(效率更高)

      但是,你需要确保你是不区分大小写的
      \d*\d*
      严格等同于
      \d*
      任何带有
      *
      的东西都可以并且将匹配空字符串。你想要
      \d+
      并且想要使许多元素成为可选的。尝试类似
      (\d+(\d+)(\th)?(?:-(\d+)(th)?)?)(apr)(?:il)?
      首先。是的,对于正则表达式,最好避免在开始时匹配相同字符的替代组,以减少重复回溯。可选组在这些情况下效果非常好。这是一个很好的技巧,但似乎正则表达式并没有捕获日期,只是匹配输入。@AdrienBrunelat:您不理解how regex的工作原理是:不捕获日期,只匹配输入。匹配总是捕获到组0中。如果我们必须使用包含整个模式的外部捕获组,这取决于语言。在较旧版本的Perl中,这是一个非常好的主意,而且仅此而已。您的overkill表达式为我节省了更多的时间!谢谢阿德里安!我不是英国人,也许你应该考虑检查每个月的拼写,哈哈。它都是正确的,谢谢。我能把13-16之间的‘-’替换为通配符‘*’,以便捕获13到16或13/16的任何东西吗?我会建议使用一组已知字符而不是像<代码> [-~/] < /COD>(根据您的意愿添加字符,不要忘记转义需要转义的内容)您不需要外部捕获括号:整个匹配始终放在组0中,通常可以轻松检索。