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
的任何变体)
基本上,有两个备选方案匹配四月和日期范围:
-1+位,后跟可选的(\d+)(:st |[nr]d | th)-?(\d*)(?:st |[nr]d | th)\s*Apr(?:il)
,st
,nd
,后跟可选的连字符,后跟0+位,后跟可选的th
,etc.后跟0+空格,然后是st
或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中,通常可以轻松检索。