Look:
-
整个输入(字符串)长度始终为 10 到 12 个字符 -
^.{10,12}$
(HOWEVER,在这种情况下,您不需要将其添加到整体模式中,因为下面的所有部分总计最多为字符串中允许的 10、11 或 12 个字符)
-
前 3 个字符是唯一的小写英文字母 (
[a-z]
) - ^([a-z])(?!\\1)([a-z])(?!\\1|\\2)[a-z]
-
接下来的4个字符代表从1500到2020年的当前年份,即2020 -
(?:1[5-9][0-9]{2}|20[01][0-9]|2020)
-
接下来的字符只能是 10、100 或 1000 个(因此至少 2 个字符(即 10),或最多 4 个字符(即 1000)) -
[0-9]{2,4}
-
最后一个字符是 0 到 9 之间的数字 -
[0-9]
.
连接这些位,你会得到
String regex = "^([a-z])(?!\\1)([a-z])(?!\\1|\\2)[a-z](?:1[5-9][0-9]{2}|20[01][0-9]|2020)[0-9]{2,4}[0-9]$";
See the 正则表达式演示 https://regex101.com/r/gwkBic/1.
如果您计划支持小写和大写字母,请添加不区分大小写修饰符(?i)
在开始时:
String regex = "(?i)^([a-z])(?!\\1)([a-z])(?!\\1|\\2)[a-z](?:1[5-9][0-9]{2}|20[01][0-9]|2020)[0-9]{2,4}[0-9]$";
如果末尾可以是字母,而不仅仅是数字,则可以使用
String regex = "(?i)^([a-z])(?!\\1)([a-z])(?!\\1|\\2)[a-z](?:1[5-9][0-9]{2}|20[01][0-9]|2020)[0-9]{2,4}[0-9a-z]$";
See 这个正则表达式演示 https://regex101.com/r/gwkBic/2.
要创建正则表达式数字范围,您可以使用以下众所周知的服务gamon.webfactional.com http://gamon.webfactional.com/regexnumericrangegenerator/ or 里奇·本德尔.ml https://www.richie-bendall.ml/ros-regex-numeric-range-generator/, or MyRegexTester.com https://www.myregextester.com/index.php.
See the Java演示 https://ideone.com/bwt5sF:
String regex = "(?i)(([a-z])(?!\\2)([a-z])(?!\\2|\\3)[a-z])(1[5-9][0-9]{2}|20[01][0-9]|2020)([0-9]{2,4})([0-9a-z])";
String s = "AVG190420T";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(s);
if (matcher.find()){
System.out.println("Part 1: " + matcher.group(1));
System.out.println("Part 2: " + matcher.group(4));
System.out.println("Part 3: " + matcher.group(5));
System.out.println("Part 4: " + matcher.group(6));
} else {
System.out.println(s + " does not match the pattern.");
}
Output:
Part 1: AVG
Part 2: 1904
Part 3: 20
Part 4: T