我正在尝试匹配有2位数字且重复数字的数字,数字长度为7位数。
我想匹配java中的这些数字。
示例数字:
3433434
6776767
9000999
请帮助为这些模式编号创建正则表达式
答案 0 :(得分:1)
我建议将任何正则表达式隐藏在帮助方法中:
private static boolean matchesCriteria(String s) {
return exactlySevenDigits(s) && containsRepeatedDigits(s);
}
private static boolean exactlySevenDigits(String s) {
return s.matches("\\d{7}");
}
private static boolean containsRepeatedDigits(String s) {
return s.matches(".*(\\d)\\1.*");
}
示例结果:
3433434 true
6776767 true
9000999 true
1234567 false (no repeating numbers)
12331233 false (too long)
123356A false (not all digits)
答案 1 :(得分:1)
使用正则表达式有点复杂,我会用这种方式(Java 8+)代替:
boolean check = myString.chars()
.mapToObj(i -> (char) i)
.collect(Collectors.toSet())
.size() == 2;
我们的想法是创建一个带有此字符串字符的Set,如果Set的大小为2则为正确字符串,否则不是。
或者 Ralf Renz 在评论中提及,您可以使用这个简短的方法:
boolean check = myString.chars().distinct().count() == 2;
所以你的最终解决方案应该是这样的:
boolean check = myString.matches("\\d{7}") && myString.chars().distinct().count() == 2;
答案 2 :(得分:1)
您可以按照以下方式执行此操作:
String str = "3433434";
boolean sevenOf2Digits = str.length() == 7 &&
str.matches("(\\d)\\1*+(\\d)(\\1|\\2)*");
System.out.println(sevenOf2Digits);
第一个(\\d)
捕获第1组中的第一个数字。
\\1
是对第1组的反向引用,所以第一个数字。 *
是这些数字中的0个或更多,+
使其占有,这是防止下一个(\\d)
匹配相同数字所必需的。
以下(\\d)
捕获第2组中的第二个数字。
(\\1|\\2)*
只匹配第一个或第二个数字的任意组合中的0个或更多。
为了简单起见,我将长度检查分开了。如果您需要纯正则表达式解决方案,可以通过将(?=.{7}$)
添加到正则表达式的开头,以前瞻的形式将长度检查添加到正则表达式中。
"(?=.{7}$)(\\d)\\1*+(\\d)(\\1|\\2)*"
答案 3 :(得分:0)
Getting Uncaught in (promise) DOMException once chrome is updated
这应该这样做。它找到一个数字并重复,然后找到第二个数字并重复。然后它检查数字的其余部分是否是其中之一。
我会详细解释这是做什么的。
(?=^.{7}$)(\d)\1*(?!\1)(\d)(?:\1|\2)*
:在开始之前,请确保开始和结束之间有7个字符。如果更短或更长,快速失败。
(?=^.{7}$)
:获取第一个数字并将其保存在捕获组中。然后匹配,如果捕获的数字也是下一个。如果只有一个数字,下一部分将抓住它。最后一位应始终与第一位不同。
(\d)\1*(?!\1)(\d)
:重复2次捕获的数字0次或更多次。
答案 4 :(得分:-1)
String regex = "[10]{7}|[20]{7}|[21]{7}|[30]{7}|[31]{7}|[32]{7}|[40]{7}|[41]{7}|[42]{7}|[43]{7}|[50]{7}|[51]{7}|[52]{7}|[53]{7}|[54]{7}|[60]{7}|[61]{7}|[62]{7}|[63]{7}|[64]{7}|[65]{7}|[70]{7}|[71]{7}|[72]{7}|[73]{7}|[74]{7}|[75]{7}|[76]{7}|[80]{7}|[81]{7}|[82]{7}|[83]{7}|[84]{7}|[85]{7}|[86]{7}|[87]{7}|[90]{7}|[91]{7}|[92]{7}|[93]{7}|[94]{7}|[95]{7}|[96]{7}|[97]{7}|[98]{7}";
System.out.println(Pattern.matches(regex, "3433434"));
System.out.println(Pattern.matches(regex, "6776767"));
System.out.println(Pattern.matches(regex, "9000999"));
应该这样做。两个数字的所有组合,长度为7。