3

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

qwwwwwwwwweeeeerrtyyyyyqqqqwEErTTT

它应该匹配

(匹配组)“结果”

(1) “q”

(2) “wwwwwwwww”

(3) “eeeee”

(4) “rr”

(5) “t”

(6) “年年”

(七)“qqqq”

(8) “w”

(9) “EE”

(10) “r”

(11) “TTT”

在做了一些研究之后,这是我能想到的最好的

/(.)(\1*)/g

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

4

4 回答 4

4

怎么样/((.)(\2*))/g?这样,您就可以将整个组匹配(我假设这就是您想要的,而这正是您找到的解决方案所缺少的)。

于 2013-10-30T13:26:20.770 回答
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
于 2013-10-30T13:26:46.363 回答
1

假设@cruncher 所说的前提是正确的:“我们希望在不事先知道应该重复哪个字母的情况下捕获重复的字母组”然后:

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

上面的 RegEx 应该允许捕获重复的字母组,而无需硬编码它们出现的特定顺序。

?+是一个不情愿的占有量词,如果当前案例有效,则不保存以前有效的回溯案例,从而帮助我们不浪费 RAM 空间。

于 2013-10-30T13:21:10.363 回答
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);
于 2013-10-30T13:37:09.067 回答