正则表达式匹配/分组字符串中的重复字符

时间:2013-10-30 13:16:25

标签: java regex expression

我需要一个能够匹配字符串中字符组的正则表达式。这是一个示例字符串:

qwwwwwwwwweeeeerrtyyyyyqqqqwEErTTT

它应匹配

(匹配组)“结果”

(1)“q”

(2)“wwwwwwwww”

(3)“eeeee”

(4)“rr”

(5)“t”

(6)“yyyyy”

(7)“qqqq”

(8)“w”

(9)“EE”

(10)“r”

(11)“TTT”

经过一些研究后,这是我能想到的最好的

/(.)(\1*)/g

我遇到的问题是使用\1反向引用的唯一方法是首先捕获角色。如果我可以参考非捕获组的结果,我可以解决这个问题但是在研究之后我不认为这是可能的。

4 个答案:

答案 0 :(得分:3)

/((.)(\2*))/g(未经测试)怎么样?这样一来,你就可以把整个团体作为一个整体(我假设那就是你想要的,那就是你找到的解决方案所缺乏的)。

答案 1 :(得分:3)

看起来你需要在循环中使用Matcher:

Pattern p = Pattern.compile("((.)\\2*)");
Matcher m = p.matcher("qwwwwwwwwweeeeerrtyyyyyqqqqwEErTTT");
while (m.find()) {
    System.out.println(m.group(1));
}

输出:

q
wwwwwwwww
eeeee
rr
t
yyyyy
qqqq
w
EE
r
TTT

答案 2 :(得分:1)

假设@cruncher所说的前提是真的:“我们想要在不知道哪个字母应该重复的情况下抓住重复的字母组”然后:

/((a*?+)|(b*?+)|(c*?+)|(d*?+)|(e*?+)|(f*?+)|(g*?+)|(h*?+))/

上述RegEx应允许捕获重复的字母组,而无需硬编码它们将发生的特定顺序。

?+是一个不情愿的积极量词,如果当前案例有效,我们不会因为没有保存以前有效的回溯案例而浪费RAM空间。

答案 3 :(得分:0)

由于你标记了java,我将提供一个替代的非正则表达式解决方案(我相信需求是最终产品,而不是你到达那里的方法)。

String repeat = "";
char c = '';
for(int i = 0 ; i < s.length() ; i++) {
    if(s.charAt(i) == c) {
        repeat += c;
    } else {
        if(!repeat.isEmpty()) 
            doSomething(repeat); //add to an array if you want
        c = s.charAt(i);
        repeat = "" + c;
    }
}
if(!repeat.isEmpty())
    doSomething(repeat);