Java 仅与2位重复数字匹配的正则表达式
我正在尝试匹配有2个数字的数字,这些数字是重复的,数字的长度是7位 我想匹配java中的这些数字 示例编号: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
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ᴀтᴇ 我同意你的看法,有很多方法,其中之一