diff --git a/CHANGELOG.md b/CHANGELOG.md index 1829f9e0f..1bd7aa9d0 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.19.M1 (2023-04-19) +# 5.8.19.M1 (2023-04-22) ### 🐣新特性 * 【db 】 优化HttpRequest.toString()内容打印(issue#3072@Github) @@ -10,6 +10,7 @@ ### 🐞Bug修复 * 【core 】 修复URLUtil.decode无法解码UTF-16问题(issue#3063@Github) * 【db 】 修复insertOrUpdate更新中条件字段没有移除问题(issue#I6W91Z@Gitee) +* 【core 】 修复VIN(车架号)正则问题(pr#3078@Github) ------------------------------------------------------------------------------------------------------------- # 5.8.18 (2023-04-16) diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/PatternPool.java b/hutool-core/src/main/java/cn/hutool/core/lang/PatternPool.java index 20aa6cf58..5d037116a 100755 --- a/hutool-core/src/main/java/cn/hutool/core/lang/PatternPool.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/PatternPool.java @@ -151,12 +151,29 @@ public class PatternPool { */ public static final Pattern CREDIT_CODE = Pattern.compile(RegexPool.CREDIT_CODE); /** - * 车架号 - * 别名:车辆识别代号 车辆识别码 - * eg:LDC613P23A1305189 - * eg:LSJA24U62JG269225 - * 十七位码、车架号 - * 车辆的唯一标示 + * 车架号(车辆识别代号由世界制造厂识别代号(WMI、车辆说明部分(VDS)车辆指示部分(VIS)三部分组成,共 17 位字码。)
+ * 别名:车辆识别代号、车辆识别码、车架号、十七位码
+ * 标准号:GB 16735-2019
+ * 标准官方地址:https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=E2EBF667F8C032B1EDFD6DF9C1114E02 + * 对年产量大于或等于1 000 辆的完整车辆和/或非完整车辆制造厂: + *
+	 *   第一部分为世界制造厂识别代号(WMI),3位
+	 *   第二部分为车辆说明部分(VDS),     6位
+	 *   第三部分为车辆指示部分(VIS),     8位
+	 * 
+ * + * 对年产量小于 1 000 辆的完整车辆和/或非完整车辆制造厂: + *
+	 *   第一部分为世界制造广识别代号(WMI),3位;
+	 *   第二部分为车辆说明部分(VDS),6位;
+	 *   第三部分的三、四、五位与第一部分的三位字码起构成世界制造厂识别代号(WMI),其余五位为车辆指示部分(VIS),8位。
+	 * 
+ * + *
+	 *   eg:LDC613P23A1305189
+	 *   eg:LSJA24U62JG269225
+	 *   eg:LBV5S3102ESJ25655
+	 * 
*/ public static final Pattern CAR_VIN = Pattern.compile(RegexPool.CAR_VIN); /** diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/RegexPool.java b/hutool-core/src/main/java/cn/hutool/core/lang/RegexPool.java index ed8a73ef3..b862a7d51 100755 --- a/hutool-core/src/main/java/cn/hutool/core/lang/RegexPool.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/RegexPool.java @@ -158,14 +158,31 @@ public interface RegexPool { */ String CREDIT_CODE = "^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$"; /** - * 车架号 - * 别名:车辆识别代号 车辆识别码 - * eg:LDC613P23A1305189 - * eg:LSJA24U62JG269225 - * 十七位码、车架号 - * 车辆的唯一标示 + * 车架号(车辆识别代号由世界制造厂识别代号(WMI、车辆说明部分(VDS)车辆指示部分(VIS)三部分组成,共 17 位字码。)
+ * 别名:车辆识别代号、车辆识别码、车架号、十七位码
+ * 标准号:GB 16735-2019
+ * 标准官方地址:https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=E2EBF667F8C032B1EDFD6DF9C1114E02 + * 对年产量大于或等于1 000 辆的完整车辆和/或非完整车辆制造厂: + *
+	 *   第一部分为世界制造厂识别代号(WMI),3位
+	 *   第二部分为车辆说明部分(VDS),     6位
+	 *   第三部分为车辆指示部分(VIS),     8位
+	 * 
+ * + * 对年产量小于 1 000 辆的完整车辆和/或非完整车辆制造厂: + *
+	 *   第一部分为世界制造广识别代号(WMI),3位;
+	 *   第二部分为车辆说明部分(VDS),6位;
+	 *   第三部分的三、四、五位与第一部分的三位字码起构成世界制造厂识别代号(WMI),其余五位为车辆指示部分(VIS),8位。
+	 * 
+ * + *
+	 *   eg:LDC613P23A1305189
+	 *   eg:LSJA24U62JG269225
+	 *   eg:LBV5S3102ESJ25655
+	 * 
*/ - String CAR_VIN = "^[A-HJ-NPR-Z0-9]{8}[0-9X][A-HJ-NPR-Z0-9]{2}\\d{6}$"; + String CAR_VIN = "^[A-HJ-NPR-Z0-9]{8}[X0-9]([A-HJ-NPR-Z0-9]{3}\\d{5}|[A-HJ-NPR-Z0-9]{5}\\d{3})$"; /** * 驾驶证 别名:驾驶证档案编号、行驶证编号 * eg:430101758218 diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/ValidatorTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/ValidatorTest.java index 11da7f5fd..b90497d8c 100755 --- a/hutool-core/src/test/java/cn/hutool/core/lang/ValidatorTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/ValidatorTest.java @@ -222,6 +222,12 @@ public class ValidatorTest { Assert.assertTrue(Validator.isCarVin("LSJA24U62JG269225")); Assert.assertTrue(Validator.isCarVin("LDC613P23A1305189")); Assert.assertFalse(Validator.isCarVin("LOC613P23A1305189")); + + Assert.assertTrue(Validator.isCarVin("LSJA24U62JG269225")); //标准分类1 + Assert.assertTrue(Validator.isCarVin("LDC613P23A1305189")); //标准分类1 + Assert.assertTrue(Validator.isCarVin("LBV5S3102ESJ25655")); //标准分类1 + Assert.assertTrue(Validator.isCarVin("LBV5S3102ESJPE655")); //标准分类2 + Assert.assertFalse(Validator.isCarVin("LOC613P23A1305189")); //错误示例 } @Test