From 59dc7dec39ddda62399622508ec97cc7ec502845 Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 11 Jun 2024 20:19:07 +0800 Subject: [PATCH] fix code --- .../date/format/parser/RegexDateParser.java | 4 +- .../format/parser/RegexListDateParser.java | 3 +- .../format/parser/RegexDateParserTest.java | 95 +++++++++++++++++-- 3 files changed, 92 insertions(+), 10 deletions(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/RegexDateParser.java b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/RegexDateParser.java index a7a635071..d8673dfeb 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/RegexDateParser.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/RegexDateParser.java @@ -14,7 +14,6 @@ package org.dromara.hutool.core.date.format.parser; import org.dromara.hutool.core.date.*; import org.dromara.hutool.core.lang.Opt; -import org.dromara.hutool.core.regex.PatternPool; import org.dromara.hutool.core.regex.ReUtil; import org.dromara.hutool.core.text.StrUtil; @@ -43,7 +42,8 @@ public class RegexDateParser implements PredicateDateParser { * @return RegexDateParser */ public static RegexDateParser of(final String regex) { - return of(PatternPool.get(regex)); + // 日期正则忽略大小写 + return of(Pattern.compile(regex, Pattern.CASE_INSENSITIVE)); } /** diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/RegexListDateParser.java b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/RegexListDateParser.java index 4f65a2104..950e0f2ed 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/RegexListDateParser.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/RegexListDateParser.java @@ -58,7 +58,8 @@ public class RegexListDateParser implements DateParser, Serializable { * @return this */ public RegexListDateParser addRegex(final String regex) { - return addPattern(Pattern.compile(regex)); + // 日期正则忽略大小写 + return addPattern(Pattern.compile(regex, Pattern.CASE_INSENSITIVE)); } /** diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/date/format/parser/RegexDateParserTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/date/format/parser/RegexDateParserTest.java index 6fb35c2e6..97ca539cc 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/date/format/parser/RegexDateParserTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/date/format/parser/RegexDateParserTest.java @@ -1,29 +1,110 @@ package org.dromara.hutool.core.date.format.parser; import org.dromara.hutool.core.date.DateUtil; -import org.junit.jupiter.api.Assertions; +import org.dromara.hutool.core.regex.ReUtil; import org.junit.jupiter.api.Test; import java.util.Date; +import java.util.regex.Pattern; + +import static org.junit.jupiter.api.Assertions.*; public class RegexDateParserTest { + + // hh:mm:ss.SSSSZ hh:mm:ss.SSSS hh:mm:ss hh:mm + final String timeRegex = "(" + + "\\s(?\\d{1,2})" + + ":(?\\d{1,2})" + + "(:(?\\d{1,2}))?" + + "(?:[.,](?\\d{1,9}))?(?z)?" + + "(\\s?(?am|pm))?" + + ")?"; + // +08:00 +0800 +08 + final String zoneOffsetRegex = "(\\s?(?[-+]\\d{1,2}:?(?:\\d{2})?))?"; + // CST UTC (CST) + final String zoneNameRegex = "(\\s[(]?(?[a-z ]+)[)]?)?"; + + @Test + void timeMatchTest() { + assertMatch(timeRegex, " 15:04:05"); + assertMatch(timeRegex, " 15:04:05.3186369"); + assertMatch(timeRegex, " 15:04:05.3186369z"); + assertMatch(timeRegex, " 15:04:05.318"); + assertMatch(timeRegex, " 15:04:05.318"); + assertMatch(timeRegex, " 15:04"); + assertMatch(timeRegex, " 05:04pm"); + assertMatch(timeRegex, " 05:04 PM"); + assertMatch(timeRegex, " 05:04:12PM"); + assertMatch(timeRegex, " 05:04:12 PM"); + assertMatch(timeRegex, " 5:4pm"); + assertMatch(timeRegex, " 5:4am"); + } + + @Test + void zoneOffsetMatchTest() { + assertMatch(zoneOffsetRegex, "+0800"); + assertMatch(zoneOffsetRegex, "+08"); + assertMatch(zoneOffsetRegex, "+08:00"); + assertMatch(zoneOffsetRegex, " +08:00"); + assertMatch(zoneOffsetRegex, "+0000"); + assertMatch(zoneOffsetRegex, " -0700"); + } + + @Test + void zoneNameMatchTest() { + assertMatch(zoneNameRegex, " (CST)"); + assertMatch(zoneNameRegex, " CST"); + assertMatch(zoneNameRegex, " (GMT)"); + assertMatch(zoneNameRegex, " (CEST)"); + assertMatch(zoneNameRegex, " (GMT Daylight Time)"); + } + @Test void parsePureTest() { // yyyyMMdd final RegexDateParser parser = RegexDateParser.of("^(?\\d{4})(?\\d{2})(?\\d{2})$"); final Date parse = parser.parse("20220101"); - Assertions.assertEquals("2022-01-01", DateUtil.date(parse).toDateStr()); + assertEquals("2022-01-01", DateUtil.date(parse).toDateStr()); } @Test void parseMonthFirstTest() { + final String dateRegex = "(?\\w+{3,9})\\W+(?\\d{1,2})(?:th)?\\W+(?\\d{2,4})"; + + // +08:00 + // +0800 + // +08 + final String zoneOffsetRegex = "(\\s?(?[-+]\\d{1,2}:?(?:\\d{2})?))?"; + // May 8, 2009 5:57:51 - final RegexDateParser parser = RegexDateParser.of("(?\\w+)\\W+(?\\d{1,2})(?:th)?\\W+(?\\d{2,4})(\\s(?\\d{1,2}):(?\\d{1,2}):(?\\d{1,2}))?"); + final RegexDateParser parser = RegexDateParser.of(dateRegex + timeRegex + zoneOffsetRegex); - final Date parse = parser.parse("May 8, 2009 5:57:51"); - Assertions.assertEquals("2009-05-08 05:57:51", DateUtil.date(parse).toString()); + Date parse = parser.parse("May 8, 2009 5:57:51"); + assertEquals("2009-05-08 05:57:51", DateUtil.date(parse).toString()); - final Date parse2 = parser.parse("May 8, 2009"); - Assertions.assertEquals("2009-05-08 00:00:00", DateUtil.date(parse2).toString()); + parse = parser.parse("May 8, 2009 5:57:51 +08:00"); + assertEquals("2009-05-08 05:57:51", DateUtil.date(parse).toString()); + + parse = parser.parse("May 8, 2009 5:57:51 +0800"); + assertEquals("2009-05-08 05:57:51", DateUtil.date(parse).toString()); + + parse = parser.parse("May 8, 2009 5:57:51 +08"); + assertEquals("2009-05-08 05:57:51", DateUtil.date(parse).toString()); + + parse = parser.parse("May 8, 2009"); + assertEquals("2009-05-08 00:00:00", DateUtil.date(parse).toString()); + + parse = parser.parse("May 8th, 2009"); + assertEquals("2009-05-08 00:00:00", DateUtil.date(parse).toString()); + + parse = parser.parse("May 8th, 09"); + assertEquals("2009-05-08 00:00:00", DateUtil.date(parse).toString()); + + parse = parser.parse("may. 8th, 09"); + assertEquals("2009-05-08 00:00:00", DateUtil.date(parse).toString()); + } + + private static void assertMatch(final String regex, final String dateStr){ + assertTrue(ReUtil.isMatch(Pattern.compile(regex, Pattern.CASE_INSENSITIVE), dateStr)); } }