Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.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 使用正则表达式查找字符串中至少一个重复字符_Java_Regex_Repeat - Fatal编程技术网

Java 使用正则表达式查找字符串中至少一个重复字符

Java 使用正则表达式查找字符串中至少一个重复字符,java,regex,repeat,Java,Regex,Repeat,因此,我分配了一个额外的任务,它要求编写一个程序,如果给定字符串中至少有一个字符重复,该程序将返回true 我对正则表达式比较陌生,但据我所知,这应该是可行的: String input = "wool"; return input.matches(".*(.)/1+.*"); 这应该返回true,因为开头和结尾的“.*”表示可能有前缀或后缀。“()/1+”是任何字符的重复模式 正如我所说,我对regex的东西比较陌生,但我对学习和理解它非常感兴趣。几乎完美,只是/看起来有点不对劲(应该是\)

因此,我分配了一个额外的任务,它要求编写一个程序,如果给定字符串中至少有一个字符重复,该程序将返回true

我对正则表达式比较陌生,但据我所知,这应该是可行的:

String input = "wool";
return input.matches(".*(.)/1+.*");
这应该返回true,因为开头和结尾的“.*”表示可能有前缀或后缀。“()/1+”是任何字符的重复模式


正如我所说,我对regex的东西比较陌生,但我对学习和理解它非常感兴趣。

几乎完美,只是
/
看起来有点不对劲(应该是
\

此外,前缀和后缀不需要
*
,regexp将在字符串中的任何位置找到匹配项,因此
()\1
后缀。这不是一个错误,只是一个优化(尽管在其他情况下,它可能,也确实会产生影响)

还有一个问题是反斜杠是Java字符串中的特殊字符,所以当您用Java编写regexp时,需要加倍使用反斜杠。这将为您提供:

return input.matches(".*(.)\\1.*");
编辑:我忘了,你不需要
+
,因为如果某个东西重复3次,它也会重复2次,所以你只需搜索两个字符的重复就可以找到它。再说一遍,这不是一个错误,只是这里不需要

Kita有一个很好的观点,那就是您的任务没有很好的定义,因为它没有说明您是在寻找彼此相邻的重复字符还是字符串中的任何位置。我的解决方案是针对相邻字符;如果你需要在任何地方重复,使用他的

EDIT2注释后:忘记了
.matches
的语义。你们都很正确,编辑得很恰当。

如果任务“在给定字符串中至少重复一个字符”包括以下模式:

  • abcbd
    b
    重复)
那么正则表达式模式将是:

(.).*\1
此模式假定其他字符可能位于重复字符之间。否则

()\1

请注意,任务是捕获“至少有一个字符重复”,这意味着识别单个事件就足够了,因此
\1
不必有
+
量词

守则:

return input.matches("(.).*\\1");


另一种解决方案是将元素添加到hashset中。然后检查字符串和哈希集的长度。

谢谢您的回答,但由于某些原因,删除“*”会导致错误的答案。我的猜测是,模式必须完全匹配,而不仅仅是部分匹配。和“(..\\1”仅与重复相同字符两次的字符串匹配。但将斜杠加倍可以解决问题。
input.matches(“()\\1”)
这在Java中不起作用,因为
String.matches()
确保正则表达式匹配整行。搜索字符串中是否存在模式只能由Matcher.find()完成<代码>输入。匹配(“.*()\\1.*”是OP需要的。
return input.matches("(.)\\1");