我需要一个能够匹配字符串中字符组的正则表达式。这是一个示例字符串:
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
反向引用的唯一方法是首先捕获角色。如果我可以参考非捕获组的结果,我可以解决这个问题但是在研究之后我不认为这是可能的。
答案 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);