正则表达式匹配数字仅重复2位数

时间:2018-04-25 14:01:50

标签: java regex

我正在尝试匹配有2位数字且重复数字的数字,数字长度为7位数。

我想匹配java中的这些数字。

示例数字:

3433434
6776767
9000999

请帮助为这些模式编号创建正则表达式

5 个答案:

答案 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。