diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/comparator/VersionComparator.java b/hutool-core/src/main/java/org/dromara/hutool/core/comparator/VersionComparator.java
index 7fa6b29d9..f02385ae0 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/comparator/VersionComparator.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/comparator/VersionComparator.java
@@ -12,22 +12,16 @@
package org.dromara.hutool.core.comparator;
-import org.dromara.hutool.core.convert.Convert;
-import org.dromara.hutool.core.math.NumberUtil;
-import org.dromara.hutool.core.regex.ReUtil;
-import org.dromara.hutool.core.text.StrUtil;
-import org.dromara.hutool.core.text.split.SplitUtil;
+import org.dromara.hutool.core.lang.Version;
import java.io.Serializable;
-import java.util.List;
-import java.util.regex.Pattern;
/**
* 版本比较器
* 比较两个版本的大小
* 排序时版本从小到大排序,即比较时小版本在前,大版本在后
* 支持如:1.3.20.8,6.82.20160101,8.5a/8.5c等版本形式
- * 参考:https://www.cnblogs.com/shihaiming/p/6286575.html
+ * 参考:java.lang.module.ModuleDescriptor.Version
*
* @author Looly
* @since 4.0.2
@@ -35,8 +29,6 @@ import java.util.regex.Pattern;
public class VersionComparator extends NullComparator implements Serializable {
private static final long serialVersionUID = 1L;
- private static final Pattern PATTERN_PRE_NUMBERS= Pattern.compile("^\\d+");
-
/**
* 单例
*/
@@ -78,40 +70,6 @@ public class VersionComparator extends NullComparator implements Seriali
* @param version2 版本2
*/
private static int compareVersion(final String version1, final String version2) {
- final List v1s = SplitUtil.splitTrim(version1, StrUtil.DOT);
- final List v2s = SplitUtil.splitTrim(version2, StrUtil.DOT);
-
- int diff = 0;
- final int minSize = Math.min(v1s.size(), v2s.size());// 取最小长度值
- String v1;
- String v2;
- for (int i = 0; i < minSize; i++) {
- v1 = v1s.get(i);
- v2 = v2s.get(i);
- // 先比较长度
- diff = v1.length() - v2.length();
- if (0 == diff) {
- // 长度相同,直接比较字符或数字
- diff = v1.compareTo(v2);
- } else {
- // 不同长度,且含有字母
- if(!NumberUtil.isNumber(v1) || !NumberUtil.isNumber(v2)){
- //不同长度的先比较前面的数字;前面数字不相等时,按数字大小比较;数字相等的时候,继续按长度比较,类似于 103 > 102a
- final int v1Num = Convert.toInt(ReUtil.get(PATTERN_PRE_NUMBERS, v1, 0), 0);
- final int v2Num = Convert.toInt(ReUtil.get(PATTERN_PRE_NUMBERS, v2, 0), 0);
- final int diff1 = v1Num - v2Num;
- if (diff1 != 0) {
- diff = diff1;
- }
- }
- }
- if (diff != 0) {
- //已有结果,结束
- break;
- }
- }
-
- // 如果已经分出大小,则直接返回,如果未分出大小,则再比较位数,有子版本的为大;
- return (diff != 0) ? diff : v1s.size() - v2s.size();
+ return CompareUtil.compare(Version.of(version1), Version.of(version2));
}
}
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/lang/Version.java b/hutool-core/src/main/java/org/dromara/hutool/core/lang/Version.java
new file mode 100644
index 000000000..1d60c9dbe
--- /dev/null
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/lang/Version.java
@@ -0,0 +1,279 @@
+/*
+ * 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.lang;
+
+import org.dromara.hutool.core.comparator.CompareUtil;
+import org.dromara.hutool.core.text.CharUtil;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 字符串版本表示,用于解析版本号的不同部分并比较大小。
+ * 来自:java.lang.module.ModuleDescriptor.Version
+ *
+ * @author Looly
+ */
+public class Version implements Comparable, Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 解析版本字符串为Version对象
+ *
+ * @param v 版本字符串
+ * @return The resulting {@code Version}
+ * @throws IllegalArgumentException 如果 {@code v} 为 {@code null}或 ""或无法解析的字符串,抛出此异常
+ */
+ public static Version of(final String v) {
+ return new Version(v);
+ }
+
+ private final String version;
+
+ private final List