以下模式需要一个单独的组合正则表达式:
Prefix: 2221-2720 , Length: 16
Prefix: 51-55 , Length: 16
其中,分隔符b/w数字可以是空格((、减号(-(、句点(.(、反斜杠(\(、等于(=(。条件是多个分隔符(相同或不同类型(不能出现一次以上,且不能出现两位数字。
- 有效号码-
230.293.217.952.148.4
- 有效号码-
230.293 217-952.148.4
- 无效号码-
230..293.217.952.148.4
- 无效号码-
230.293.-217. 952.148.4
有效输入是指只要没有两个相邻的分隔符,就有16位数字由任意/无分隔符分隔。
已经想出了以下正则表达式:
(2[s=\.-]*2[s=\.-]*2[s=\.-]*[1-9][s=\.-]*|2[s=\.-]*2[s=\.-]*[3-9][s=\.-]*[0-9][s=\.-]*|2[s=\.-]*[3-6][s=\.-]*[0-9](?:[s=\.-]*[0-9]){1}|2[s=\.-]*7[s=\.-]*[01][s=\.-]*[0-9][s=\.-]*|2[s=\.-]*7[s=\.-]*2[s=\.-]*0[s=\.-]*)[0-9](?:[s=\.-]*[0-9]){11}|(5[s=\.-]*[1-5][s=\.-]*)[0-9](?:[s=\.-]*[0-9]){13}
它与某些模式不匹配。例如:
2 3 0 2 9 3 2 1 7 9 5 2 1 4 8 4
23-02-93-21-79-52-14-84
2 3 0 3 4 5 8 0 9 4 9 3 0 8 2 3
对于相同的数字,它匹配(如预期的(以下模式:
2302932179521484
230.293.217.952.148.4
2303458094930823
230.345.809.493.082.3
230-345-809-493-082-3
分隔符似乎有问题。请让我知道我的正则表达式出了什么问题。
对于此规则
有效的输入是由任意/否分隔的16位数字只要没有相邻的两个分隔符,就可以使用分隔符其他
前缀:2221-2720,长度:16
前缀:51-55,长度:16
2221也可以写成2.2.-2.1
对于这些规则,编写一个具有2个捕获组的模式来匹配整个字符串可能会更容易。
然后使用一些Java代码,您可以检查范围的捕获组的值。
^((d[ =\.-]?d)[ =\.-]?d[ =\.-]?d)(?:[ =\.-]?d){12}$
模式匹配:
^
字符串开始(
捕获组1(d[ =\.-]?d)
捕获组2用可选字符匹配两位数字=
.
-
[ =\.-]?d[ =\.-]?d
匹配2次(可选(列出的字符中的1个和一个数字
)
关闭组1(?:[ =\.-]?d){12}
匹配其中一个字符和一个数字重复12次$
字符串结束
Regex演示| Java演示
例如
String strings[] = {
"2221.7.952.148.412.32",
"230.293.217.952.148.4",
"5511111111111111",
"130.293 217-952.148.4",
"30..293.217.952.148.4",
"5..5",
".5.5."
};
String regex = "^((\d[ =\\.-]?\d)[ =\\.-]?\d[ =\\.-]?\d)(?:[ =\\.-]?\d){12}$";
Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
for (String s : strings) {
Matcher matcher = pattern.matcher(s);
if (matcher.find()) {
int grp1 = Integer.parseInt(matcher.group(1).replaceAll("\D+", ""));
int grp2 = Integer.parseInt(matcher.group(2).replaceAll("\D+", ""));
if ((grp1 >= 2221 && grp1 <= 2720) || (grp2 >=51 && grp2 <= 55)) {
System.out.println("Match for " + matcher.group());
}
}
}
输出
Match for 2221.7.952.148.412.32
Match for 230.293.217.952.148.4
Match for 5511111111111111