Regex未将所有数字与分隔符匹配



以下模式需要一个单独的组合正则表达式:

Prefix: 2221-2720 , Length: 16
Prefix: 51-55 , Length: 16

其中,分隔符b/w数字可以是空格((、减号(-(、句点(.(、反斜杠(\(、等于(=(。条件是多个分隔符(相同或不同类型(不能出现一次以上,且不能出现两位数字。

  1. 有效号码-230.293.217.952.148.4
  2. 有效号码-230.293 217-952.148.4
  3. 无效号码-230..293.217.952.148.4
  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}

它与某些模式不匹配。例如:

  1. 2 3 0 2 9 3 2 1 7 9 5 2 1 4 8 4
  2. 23-02-93-21-79-52-14-84
  3. 2 3 0 3 4 5 8 0 9 4 9 3 0 8 2 3

对于相同的数字,它匹配(如预期的(以下模式:

  1. 2302932179521484
  2. 230.293.217.952.148.4
  3. 2303458094930823
  4. 230.345.809.493.082.3
  5. 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

相关内容

  • 没有找到相关文章

最新更新