Java 正则表达式正向预测但仅匹配唯一字符?
Java regex positive look-ahead but match unique characters only?
我正在尝试将字符串输入与以下条件匹配:
- 第一个字符是唯一个小写英文字母
- 接下来的字符代表从 1500 到 2020 的当前年份
- 接下来的字符只能是10个,或100个,或1000个
- 最后一个字符将是数字 0 到 9
我认为大部分正确的我创建的正则表达式字符串是:
String validRegex =
"^"+ # start of string
(?=.*[a-z].*[a-z].*[a-z])"+ # Ensure string has only 3 consecutive lowercase English letters
"(?=.*[0-9].*[0-9].*[0-9].*[0-9])"+ # Ensure string has only 4 digits representing year i.e. 2020
"(?=.*([0-9].*[0-9]) | ([0-9].*[0-9].*[0-9]) | ([0-9].*[0-9].*[0-9].*[0-9]))"+ # Ensure 10, 100, or 100 digits
"(?=.*[0-9])"+ # Ensure last character is a digit 0-9
"(?=\S+$)"+ # Ensure string has no whitespace
".{10,12}"+ # Entire string length must be from 10 through 12 characters
"$"; # end of string
是否有一种简单的方法来更新我的正则表达式,以便我只能检测唯一的连续字符?
看:
- 整个输入(字符串)长度始终为 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]$";
参见regex demo。
如果您打算支持大小写字母,请在开头添加不区分大小写的修饰符 (?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]$";
参见 this regex demo。
要创建正则表达式编号范围,您可以使用 well-known 服务,例如 gamon.webfactional.com or richie-bendall.ml, or MyRegexTester.com。
见 Java demo:
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.");
}
输出:
Part 1: AVG
Part 2: 1904
Part 3: 20
Part 4: T
以下正则表达式不使用前瞻,但它似乎能更好地满足初始要求:
^(abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz)(1[5-9]\d{2}|20[0-1]\d|2020)10{1,3}\d$
第 1st 组 (abc|bcd|...|xyz)
验证 唯一的连续小写 字母。
第2nd组验证年份:
(1[5-9]\d{2}|20[01]\d|2020)
匹配年份从 1500 到 2020
剩余数字后缀已验证:
10{1,3}
匹配 10、100 或 100
\d
匹配结束数字
更新
对于年份范围 1900..2019,模式是 (19\d{2}|20[01]\d)
对于 10、20、50、100、200、500、1000 等数字,模式为 (10{1,3}|[25]0{1,2})
我正在尝试将字符串输入与以下条件匹配:
- 第一个字符是唯一个小写英文字母
- 接下来的字符代表从 1500 到 2020 的当前年份
- 接下来的字符只能是10个,或100个,或1000个
- 最后一个字符将是数字 0 到 9
我认为大部分正确的我创建的正则表达式字符串是:
String validRegex =
"^"+ # start of string
(?=.*[a-z].*[a-z].*[a-z])"+ # Ensure string has only 3 consecutive lowercase English letters
"(?=.*[0-9].*[0-9].*[0-9].*[0-9])"+ # Ensure string has only 4 digits representing year i.e. 2020
"(?=.*([0-9].*[0-9]) | ([0-9].*[0-9].*[0-9]) | ([0-9].*[0-9].*[0-9].*[0-9]))"+ # Ensure 10, 100, or 100 digits
"(?=.*[0-9])"+ # Ensure last character is a digit 0-9
"(?=\S+$)"+ # Ensure string has no whitespace
".{10,12}"+ # Entire string length must be from 10 through 12 characters
"$"; # end of string
是否有一种简单的方法来更新我的正则表达式,以便我只能检测唯一的连续字符?
看:
- 整个输入(字符串)长度始终为 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]$";
参见regex demo。
如果您打算支持大小写字母,请在开头添加不区分大小写的修饰符 (?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]$";
参见 this regex demo。
要创建正则表达式编号范围,您可以使用 well-known 服务,例如 gamon.webfactional.com or richie-bendall.ml, or MyRegexTester.com。
见 Java demo:
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.");
}
输出:
Part 1: AVG
Part 2: 1904
Part 3: 20
Part 4: T
以下正则表达式不使用前瞻,但它似乎能更好地满足初始要求:
^(abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz)(1[5-9]\d{2}|20[0-1]\d|2020)10{1,3}\d$
第 1st 组 (abc|bcd|...|xyz)
验证 唯一的连续小写 字母。
第2nd组验证年份:
(1[5-9]\d{2}|20[01]\d|2020)
匹配年份从 1500 到 2020
剩余数字后缀已验证:
10{1,3}
匹配 10、100 或 100\d
匹配结束数字
更新
对于年份范围 1900..2019,模式是 (19\d{2}|20[01]\d)
对于 10、20、50、100、200、500、1000 等数字,模式为 (10{1,3}|[25]0{1,2})