Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅与2位重复数字匹配的正则表达式_Java_Regex - Fatal编程技术网

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

Java 仅与2位重复数字匹配的正则表达式,java,regex,Java,Regex,我正在尝试匹配有2个数字的数字,这些数字是重复的,数字的长度是7位 我想匹配java中的这些数字 示例编号: 3433434 6776767 9000999 请帮助为这些模式编号创建正则表达式我建议在helper方法中隐藏任何正则表达式: private static boolean matchesCriteria(String s) { return exactlySevenDigits(s) && containsRepeatedDigits(s); } priv

我正在尝试匹配有2个数字的数字,这些数字是重复的,数字的长度是7位

我想匹配java中的这些数字

示例编号:

3433434
6776767
9000999

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

我建议在helper方法中隐藏任何正则表达式:

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)

我建议在helper方法中隐藏任何正则表达式:

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)
应该这样做。长度为7的两个数字的所有组合


应该这样做。长度为7的两个数字的所有组合。

对于regex,它有点复杂,我将使用这种方式(Java 8+):

boolean check = myString.chars()
                .mapToObj(i -> (char) i)
                .collect(Collectors.toSet())
                .size() == 2;

其思想是用这个字符串的字符创建一个集合,如果集合的大小是2,那么它是正确的字符串,否则它不是


或者作为评论中提到的拉尔夫·伦兹,您可以使用以下简短方式:

boolean check = myString.chars().distinct().count() == 2;

因此,您的最终解决方案应如下所示:

boolean check = myString.matches("\\d{7}") && myString.chars().distinct().count() == 2;

对于regex,它有点复杂,我将使用这种方式(Java 8+):

boolean check = myString.chars()
                .mapToObj(i -> (char) i)
                .collect(Collectors.toSet())
                .size() == 2;

其思想是用这个字符串的字符创建一个集合,如果集合的大小是2,那么它是正确的字符串,否则它不是


或者作为评论中提到的拉尔夫·伦兹,您可以使用以下简短方式:

boolean check = myString.chars().distinct().count() == 2;

因此,您的最终解决方案应如下所示:

boolean check = myString.matches("\\d{7}") && myString.chars().distinct().count() == 2;

您可以按如下方式进行操作:

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)*"

您可以按如下方式进行操作:

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)*"
(?=^.{7}$)(\d)\1*(?!\1)(\d)(?:\1|\2)*

这应该可以做到。它找到一个数字并重复,然后找到第二个数字并重复。然后检查数字的其余部分是否为这2个数字之一

我将详细解释它的作用

(?=^.{7}$)
:开始之前,确保开始和结束之间有7个字符。如果较短或较长,fast将失败

(\d)\1*(?!\1)(\d)
:获取第一个数字并将其保存在捕获组中。然后匹配捕获的数字是否也是下一个数字。如果只有一个数字,下一部分将捕获该数字。最后一位数字应始终与第一位数字不同

(?:\1 |\2)
:将捕获的两个数字重复0次或以上。

(?=^.{7}$)(\d)\1*(?!\1)(\d)(?:\1 |\2)*

这应该可以做到。它找到一个数字并重复,然后找到第二个数字并重复。然后检查数字的其余部分是否为这2个数字之一

我将详细解释它的作用

(?=^.{7}$)
:开始之前,确保开始和结束之间有7个字符。如果较短或较长,fast将失败

(\d)\1*(?!\1)(\d)
:获取第一个数字并将其保存在捕获组中。然后匹配捕获的数字是否也是下一个数字。如果只有一个数字,下一部分将捕获该数字。最后一位数字应始终与第一位数字不同


(?:\1 |\2)
:将捕获的两个数字重复0次或更多次。

理想情况下,您首先提供您自己的尝试。在这方面,我不确定正则表达式是否会帮助您,因为您大约有90种可能性。示例数字的预期输出是什么?请提供您希望从“示例数字”中获得的理想结果,您首先提供您自己的尝试。在这方面,我不确定正则表达式是否会帮助您,因为您大约有90种可能性示例数的预期输出是什么?请提供您希望从“示例数”myString.chars().distinct().count()==2得到什么。这是正确的@RalfRenz我在回答中提到过您,谢谢:)这解决了问题,但并没有真正回答关于如何使用正则表达式解决问题的具体问题。是的@ᴇʟᴇvᴀтᴇ 我同意你的观点,有很多种方法,其中之一就是,比正则表达式简单,就性能而言,我认为正则表达式很慢,我不太相信早期优化。我认为,如果您将实现细节隐藏在命名良好的方法后面,您可以随时调整或重新实现它们,以提高以后的性能,如果需要的话。例如,您可以预编译正则表达式模式,然后它们会非常快。不管怎样,您仍然在使用正则表达式!:)myString.chars().distinct().count()==2较短。这是正确的@RalfRenz我在回答中提到过你,谢谢:)这解决了问题,但没有真正回答关于如何使用正则表达式解决问题的具体问题。是的@ᴇʟᴇvᴀтᴇ 我同意你的看法,有很多方法,其中之一