Java 发生检查的正则表达式问题:
检查一个数字n是否出现n次,以及该数字是否在字符串中连续出现 例如: 字符串x=“33322” 案例1:如果int N=3 检查“33322”中3是否连续出现3次 这里3在“33322”中连续出现3次。因此,我们回归真实 情况2:如果int N=2 检查“33322”中2是否连续出现2次 这里2在“33322”中连续出现2次。因此,我们回归真实 我尝试过各种正则表达式,但可能是因为不够彻底,我不清楚什么表达式可以帮助我完成这项任务。我尝试了给定的正则表达式模式 :“^[“+N+”]{“+(N-1)+”}(“+N+”)$” 但是对于这一点,输出是假的,而它应该是真的,因为您可以看到数字3在上面的示例中明显出现了3次 这里我要寻找一个正则表达式,它可以匹配N的所有可能值 N可以是2-500当使用Java 发生检查的正则表达式问题:,java,regex,Java,Regex,检查一个数字n是否出现n次,以及该数字是否在字符串中连续出现 例如: 字符串x=“33322” 案例1:如果int N=3 检查“33322”中3是否连续出现3次 这里3在“33322”中连续出现3次。因此,我们回归真实 情况2:如果int N=2 检查“33322”中2是否连续出现2次 这里2在“33322”中连续出现2次。因此,我们回归真实 我尝试过各种正则表达式,但可能是因为不够彻底,我不清楚什么表达式可以帮助我完成这项任务。我尝试了给定的正则表达式模式 :“^[“+N+”]{“+(N-1
字符串
类的匹配
方法时,使用正则表达式*(N){N}.*
,或者当使用匹配器的查找
方法时,使用正则表达式。N是您要查找的号码
编辑:添加了一个Java示例:
public static void main(String[] args) {
String s = "abc10101010101010101010xyz";
System.out.println(checkOccurrence(s, 10)); // true
s = "abc33322xyz";
System.out.println(checkOccurrence(s, 3)); // true
System.out.println(checkOccurrence(s, 2)); // true
}
private static boolean checkOccurrence(String text, int number) {
Pattern p = Pattern.compile("(" + number + "){" + number + "}");
Matcher m = p.matcher(text);
return m.find();
}
为什么不使用“(“+N+”){“+N+”}”
?如果在第一个场景中使用3333,那么它是正好3次还是至少3次呢?@JoakimDanielson应该是真的,因为它是连续的3次。@JoakimDanielson这对N>=10不起作用,因为需要在数字周围加括号。如果不想使用正则表达式:System.out.println(x.contains(String.join(“),Collections.nCopies(n,String.valueOf(n”“)))
否则可以使用:System.out.println(x.matches(“.*”(“+n+”){“+n+”}.*)代码>。任何以任何字符开头的字符串,连续包含n倍的数字n,然后以任何字符结尾,不是吗?@JoakimDanielson不管匹配多少。使用matches()
时,此正则表达式有效。如果使用find()
,则这两个*
是冗余的。由于问题没有指定是使用matches()
还是find()
,所以这个答案是有效的,但我宁愿给出不带*
的正则表达式,并添加必须使用find()
+1.如果使用匹配项
,*
是必需的。因为问题是关于使用int N
,我建议将代码编写为可重用的方法,例如布尔检查发生(字符串文本,int N){…}
,然后从main
调用该方法。这样,您将给出完整的解决方案,因为您现在也必须构建问题所需的正则表达式在这种方法中,您可以选择使用find()
,因此*
是不必要的,这是我的偏好,但这是您的答案,因此您可以选择,当然,尽管这样做性能会更好(因为它不必检查其余的输入)。;-)@安德烈亚斯:谢谢你的建议。我认为OP自己实现这个方法不会太难,但它确实让答案变得更好。