在字符串中连续(3次或更多次)查找重复的字符

时间:2015-06-28 16:56:16

标签: java regex

以下是在AAbbbc

中查找重复字符A的代码
String stringToMatch = "abccdef";
    Pattern p = Pattern.compile("((\\w)\\2+)+");
    Matcher m = p.matcher(tweet);
    while (m.find())
    {
       System.out.println("Duplicate character " + m.group(0));
    }

现在的问题是我想要找到重复但连续3次或更多次的字符, 当我在上面的代码中更改2到3时,它不起作用, 有人可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

你不应该改变2到3,因为它是capture groups的数量,而不是它的频率。你可以在这里使用两组参考:

"((\\w)\\2\\2)+"

但是你的正则表达式仍然不像你的例子那样匹配字符串!因为它只是匹配重复的字符。为了这个目的,你可以使用以下正则表达式:

"((\\w)\\2+\\2)+.*"

答案 1 :(得分:3)

您可以使用重复量词。

byte[] test = {0x01, 0x02, 0x04, 0x05, 0x06, 0x07}; 
sig.update(test);
boolean verifies = sig.verify(sigToVerify);

现在,索引1捕获重复字符,而不是索引0,它引用整个匹配。只需更改重复量词内的数字,以匹配重复Pattern p = Pattern.compile("(\\w)\\1{2,}"); Matcher m = p.matcher(tweet); while (m.find()) { System.out.println("Duplicate character " + m.group(1)); } 或更多次n的字符。

答案 2 :(得分:1)

原始正则表达式存在缺陷。它只找到“单词”字符(字母,数字,下划线)。要求是“找到连续重复3次或更多次的字符”。点是任意字符的元字符。

(?=(.)\1{3})(\1+)

因此,这将找到一个连续发生4次或更多次的角色(即,满足您对“重复”三次或更多次的角色的要求)。如果你的意思是“发生”,则将3更改为2.无论如何,它在捕获任何数据之前执行非消耗的“零长度断言”,因此应该更有效。只有在找到最低要求(单个字符重复至少3次)后,它才会消耗和捕获数据。然后你可以使用一个或多个'+'量词消耗它,因为你知道它是你想要的匹配;进一步的量化是多余的 - 你的积极前瞻已经确定(断言)。您的结果位于捕获组2“(\ 1+)”中,您可以将其称为\ 2。

注意:我使用perl命令行实用程序对其进行了测试,因此这是原始正则表达式。看起来您可能需要在使用您正在使用的编程语言之前转义某些字符。