Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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
java中提取日期和时间的正则表达式_Java_Regex - Fatal编程技术网

java中提取日期和时间的正则表达式

java中提取日期和时间的正则表达式,java,regex,Java,Regex,下面是我在每个字符串中的日期时间格式示例 March 9 12:31 AM and March 10 7:30 AM March 11 7:30 AM and March 12 10:30 AM March 31 9:00 PM and April 1 12:39 AM March 31 10:11 PM and April 1 5:23 AM 7:45 PM and 10:30 PM 我的字符串包含以下类型的日期。需要从每个字符串中提取两个日期时间 例如:从字符串1提取日期时间,如下所示:

下面是我在每个字符串中的日期时间格式示例

March 9 12:31 AM and March 10 7:30 AM
March 11 7:30 AM and March 12 10:30 AM
March 31 9:00 PM and April 1 12:39 AM
March 31 10:11 PM and April 1 5:23 AM
7:45 PM and 10:30 PM
我的字符串包含以下类型的日期。需要从每个字符串中提取两个日期时间

例如:从字符串1提取日期时间,如下所示:

March 9 12:31 AM
March 10 7:30 AM
它应适用于所有月份名称。 我不想每个月验证30或31天

这是我现在的正则表达式。有时把小时当作日期

(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|(Nov|Dec)(?:ember)?)|(\\s)[\\d]{1,2}(?!:)|(\\s)(1[012]|[1-9]):[0-5][0-9](\\s)(?i)(am|pm)+
有人能帮我解决这个问题吗

(?:(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|(Nov|Dec)(?:ember)?)\s[\d]{1,2}\s)?(?:1[012]|[1-9]):[0-5][0-9]\s(?:am|pm)

解释


(?:(?):(?:一月?:二月?:二月?)三月?四月?五月?六月?七月?八月?九月?十月?十月?十一月?十二月?:余烬?)\s[\d]{1,2}\s
匹配0或1个月和日期组合

谢谢你@Andreas的解释,所以我需要更改我的解释:

((?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|(Nov|Dec)(?:ember)?) ([1-9]|[12]\d|3[01]) )?(\b([1-9]|1[012]):[0-5]\d (?i)(am|pm))
我使用\b来不赶时间,比如
27:45 PM
,如果没有\b它赶时间
7:45 PM
(误音2)

第一个版本是(不太好):

不验证此类日期:

March 31 10:71 PM and April 1 5:23 AM
27:45 PM and 10:80 PM
May 3 4:41 PM PDT and May 41 12:19 AM PDT

为什么不
“3月9日12:31 AM和3月10日7:30 AM”。拆分(“and”)
?它不支持7:45 pm和10:30 pm,并且该日期是Strings的一部分。您能否准确地告诉我们您希望从每个示例输入中匹配什么,此外,您的正则表达式在PDT 5月3日下午4:41和PDT 5月4日凌晨12:19之间不正确匹配的内容对于此条目,它正确匹配第一个日期(5月3日下午4:41)和下一个日期(5月4日下午1),但预期是(5月4日凌晨12:19)。我相信它会在外部层次上澄清你的问题,你的正则表达式是一个三向选择:
(?:monthname)
(\\s)[\\d]{1,2}(?:)
(\\s)(1[012]|[1-9]):[0-5][0-9](\\s)(我)(am | pm)+
。为什么?它是否应该匹配
(monthname dayofmonth)?时间
?嗨@Andreas,这部分有什么问题吗?你能写更多的细节吗?我的测试是您的正则表达式将捕获
,7
作为月份的一天。逗号不是一个月中某一天的有效字符。--附带说明:1)无需将
\d
放在
[]
字符类中。它已经是一个字符类。--2) 考虑到性能,
30 | 31
最好作为
3[01]
10 | 11 | 12
作为
1[012]
3) 你的小时范围是0-12,但它应该是1-124)
\b
是怎么回事?它保证前面有一个空格,所以它是多余的5) 你为什么要捕捉空白6) 您删除了
AM/PM
匹配的不区分大小写。为什么月日是
*
重复组?这不应该是一个
可选组吗?@Andreas,你说得对。我已经更新了答案。谢谢
March 31 10:71 PM and April 1 5:23 AM
27:45 PM and 10:80 PM
May 3 4:41 PM PDT and May 41 12:19 AM PDT