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 1a5e2a681..a7a635071 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 @@ -43,7 +43,17 @@ public class RegexDateParser implements PredicateDateParser { * @return RegexDateParser */ public static RegexDateParser of(final String regex) { - return new RegexDateParser(PatternPool.get(regex)); + return of(PatternPool.get(regex)); + } + + /** + * 根据给定带名称的分组正则,创建RegexDateParser + * + * @param pattern 正则表达式 + * @return RegexDateParser + */ + public static RegexDateParser of(final Pattern pattern) { + return new RegexDateParser(pattern); } private final Pattern pattern; @@ -65,10 +75,21 @@ public class RegexDateParser implements PredicateDateParser { @Override public Date parse(final CharSequence source) throws DateException { final Matcher matcher = this.pattern.matcher(source); - if(!matcher.matches()){ + if (!matcher.matches()) { throw new DateException("Invalid date string: [{}], not match the date regex: [{}].", source, this.pattern.pattern()); } + return parse(matcher); + } + + /** + * 解析日期 + * + * @param matcher 正则匹配器 + * @return 日期 + * @throws DateException 日期解析异常 + */ + public static Date parse(final Matcher matcher) throws DateException { // 毫秒时间戳 final String millisecond = ReUtil.group(matcher, "millisecond"); if (StrUtil.isNotEmpty(millisecond)) { @@ -147,7 +168,7 @@ public class RegexDateParser implements PredicateDateParser { throw new DateException("Invalid month: [{}]", month); } - private static int parseWeek(final String week){ + private static int parseWeek(final String week) { return Week.of(week).getIso8601Value(); } @@ -184,10 +205,11 @@ public class RegexDateParser implements PredicateDateParser { /** * 解析时区偏移,类似于'+0800', '+08', '+8:00', '+08:00' + * * @param zoneOffset 时区偏移 * @return 偏移量 */ - private int parseZoneOffset(final String zoneOffset) { + private static int parseZoneOffset(final String zoneOffset) { int from = 0; final int to = zoneOffset.length(); final boolean neg = '-' == zoneOffset.charAt(from); 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 new file mode 100644 index 000000000..4f65a2104 --- /dev/null +++ b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/RegexListDateParser.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2024. looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * https://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.core.date.format.parser; + +import org.dromara.hutool.core.collection.ListUtil; +import org.dromara.hutool.core.date.DateException; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 使用正则列表方式的日期解析器
+ * 通过定义若干的日期正则,遍历匹配到给定正则后,按照正则方式解析为日期 + * + * @author Looly + */ +public class RegexListDateParser implements DateParser, Serializable { + private static final long serialVersionUID = 1L; + + /** + * 根据给定的正则列表,创建RegexListDateParser + * + * @param patterns 正则列表 + * @return RegexListDateParser + */ + public static RegexListDateParser of(final Pattern... patterns) { + return new RegexListDateParser(ListUtil.of(patterns)); + } + + private final List patterns; + + /** + * 构造 + * + * @param patterns 正则列表 + */ + public RegexListDateParser(final List patterns) { + this.patterns = patterns; + } + + /** + * 新增自定义日期正则 + * + * @param regex 日期正则 + * @return this + */ + public RegexListDateParser addRegex(final String regex) { + return addPattern(Pattern.compile(regex)); + } + + /** + * 新增自定义日期正则 + * + * @param pattern 日期正则 + * @return this + */ + public RegexListDateParser addPattern(final Pattern pattern) { + this.patterns.add(pattern); + return this; + } + + @Override + public Date parse(final CharSequence source) throws DateException { + Matcher matcher; + for (final Pattern pattern : this.patterns) { + matcher = pattern.matcher(source); + if (matcher.matches()) { + return RegexDateParser.parse(matcher); + } + } + + throw new DateException("No valid pattern for date string: [{}]", source); + } +}