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

时间:2014-10-15 01:56:02

标签: java regex repeat

所以我分配了一个奖励任务,它要求编写一个程序,如果在给定的字符串中至少重复一个字符,则返回true。

我对正则表达式相对较新,但据我所知,这应该有效:

String input = "wool";
return input.matches(".*(.)/1+.*");

这应该返回true,因为'。*'在开头和结尾表示可能有前提或足够。并且'(。)/ 1 +'是任何角色的重复模式。

正如我所说,我对正则表达式的东西相对较新,但我对学习和理解它非常感兴趣。

3 个答案:

答案 0 :(得分:2)

几乎完美,只是/看起来错误(应该是\)。

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

另一个问题是反斜杠是Java字符串中的特殊字符,因此当您在Java中编写正则表达式时,需要加倍反斜杠。这给你:

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

编辑:我忘了,你不需要+,因为如果有的东西重复3次,它也会重复2次,所以你只需要搜索一个就能找到它两个字符的重复。再次,不是错误,只是在这里不需要。

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

评论后

EDIT2 :忘记.matches的语义。你们是正确的,编辑得恰当。

答案 1 :(得分:0)

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

  • abcbd(重复b

然后正则表达式模式将是:

(.).*\1

此模式假设其他字符可能位于重复字符之间。否则

(.)\1

会做的。

请注意,任务是捕获“至少重复一个字符”,这意味着识别单个事件足以完成任务,因此\1不必具有+量词。< / p>

代码:

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

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

答案 2 :(得分:0)

替代解决方案是将元素添加到hashset。然后检查字符串和hashset的长度。