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

时间:2018-05-04 20:53:17

标签: 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

我的字符串包含以下类型的日期。需要从每个字符串中提取两个日期时间。

对于ex:from string 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)+

任何人都可以帮我解决这个问题吗

2 个答案:

答案 0 :(得分:0)

正则表达式:

(?:(?: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)

Demo

解释

(?:(?: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)?匹配0或1个月和日期组合

答案 1 :(得分:-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)

Demo

第一个版本(不太好):

((?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|(Nov|Dec)(?:ember)?)(\s)([1,2][\d]|[1-9]|30|31)(\s))?(\b[\d]|10|11|12):[0-5][0-9]\s(AM|PM)

不验证此类日期:

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