使用Java正则表达式(Regex)提取字符串中的两组日期时间
嘿,这需求我熟!我帮你写了个Java正则方案,完美适配你列出的所有日期时间格式,还支持所有英文月份,直接就能用~
解决方案
正则表达式设计
首先得覆盖你提到的三种场景:带完整月份日期的格式、跨月的完整格式,以及仅含时间的格式。对应的正则表达式如下:
^((?:(January|February|March|April|May|June|July|August|September|October|November|December) \\d{1,2} )?\\d{1,2}:\\d{2} (?:AM|PM)) 和 ((?:(January|February|March|April|May|June|July|August|September|October|November|December) \\d{1,2} )?\\d{1,2}:\\d{2} (?:AM|PM))$
正则细节说明
(?:(月份列表) \d{1,2} )?:用?标记这部分为可选,对应仅时间的场景;非捕获分组(?:...)避免生成多余的分组结果\d{1,2}:\d{2}:匹配1-2位小时+冒号+2位分钟的标准时间格式(?:AM|PM):匹配上午/下午标识,同样用非捕获分组减少干扰和:精准匹配你指定的中文分隔符(注意两边的空格)^和$:锚定字符串首尾,确保整个字符串都符合格式,避免部分匹配
如果需要支持月份缩写(比如Mar代替March),可以把月份部分替换为:
(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)
Java代码实现
下面是完整的可运行代码,包含你给出的所有测试用例:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class DateTimeExtractor { public static void main(String[] args) { // 预编译正则表达式,提升重复匹配的性能 String regex = "^((?:(January|February|March|April|May|June|July|August|September|October|November|December) \\d{1,2} )?\\d{1,2}:\\d{2} (?:AM|PM)) 和 ((?:(January|February|March|April|May|June|July|August|September|October|November|December) \\d{1,2} )?\\d{1,2}:\\d{2} (?:AM|PM))$"; Pattern pattern = Pattern.compile(regex); // 测试你提供的示例字符串 String[] testCases = { "March 9 12:31 AM 和 March 10 7:30 AM", "March 11 7:30 AM 和 March 12 10:30 AM", "March 31 9:00 PM 和 April 1 12:39 AM", "March 31 10:11 PM 和 April 1 5:23 AM", "7:45 PM 和 10:30 PM" }; for (String input : testCases) { Matcher matcher = pattern.matcher(input); if (matcher.matches()) { // 提取两组日期时间:group(1)是第一组,group(3)是第二组 String firstDateTime = matcher.group(1).trim(); String secondDateTime = matcher.group(3).trim(); System.out.println("输入字符串:" + input); System.out.println("提取的第一组:" + firstDateTime); System.out.println("提取的第二组:" + secondDateTime); System.out.println("------------------------"); } else { System.out.println("⚠️ 该字符串不符合格式:" + input); } } } }
代码说明
- 用
Pattern.compile()预编译正则,避免重复编译浪费性能 Matcher.matches()确保整个字符串完全匹配正则规则- 通过
group(1)和group(3)提取目标结果(group(2)和group(4)是可选的月份分组,不需要)
运行这段代码后,会精准输出每个测试用例的两组日期时间,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Mohan Shanmugam
相关产品推荐
相关产品推荐

