假设我有这个字符串:fffooooobbbbaarrr
。
给定数字N,对于每个重复的字符,我想显示其中的N个。
如果N = 2,则输出为ffoobbaarr
如果N = 3,则输出为fffooobbbaarrr
如果N = 1,则输出为fobar
如果N = 0,则输出为(空)
当我正在学习正则表达式时,经过一些实验,我发现这适用于N = 2:
Pattern pattern = Pattern.compile("(\\w)\\1{2,}");
System.out.println(pattern.matcher(input.replaceAll("$1$1"));
当然,对于N = 3,4等不起作用 如何解决这个问题?
答案 0 :(得分:3)
您可以使用此正则表达式替换:
int n = 3 // or whatever number;
String repl = "";
if (n > 0) {
repl = str.replaceAll("((\\S)\\2{" + (n-1) + "})\\2*", "$1");
}
示例:(对于N = 3)
示例:(对于N = 2)
<强>解释强>
(
:启动捕获组#1 (\S)
:匹配1 +非空白字符并捕获为组#2 \2{2}
:匹配同一个字符的2个实例)
:结束捕获组#1 \2*
:匹配捕获组外的相同字符的0 +个实例答案 1 :(得分:1)
使用以下正则表达式作为外观:
(\\w)(\\1{N})\\1*
故障:
(\w)
匹配并捕获一封信给捕获组1 (\1{N})
匹配之前捕获的字母N
次(捕获第2组)\1*
匹配任意数量的以下重复 N 是您需要保留的字母数(您可以将其用作变量。0
会产生空输出)并替换使用:
$2
Java代码(demo):
String str = "fffooooobbbbaarrr";
int N = 3;
str = str.replaceAll("(\\w)(\\1{" + N + "})\\1*", "$2");
System.out.println(str); // fffooobbbaarrr
答案 2 :(得分:1)
你可以像这样使用模式和匹配器:
String text = "fffooooobbbbaarrr";
Pattern pattern = Pattern.compile("(.)\\1*");
Matcher matcher = pattern.matcher(text);
String result = "";
int len = 3;
while (matcher.find()) {
if(matcher.group().length() >= len) {
result += matcher.group().substring(0, len);
}else {
result += matcher.group();
}
}
System.out.println(result);
结果:
3 --> fffooobbbaarrr
2 --> ffoobbaarr
1 --> fobar
0 --> empty
这个想法是:
(.)\1*
零次或多次