如何只显示包含多个连续字符的字符串中的某些字符?

时间:2018-04-24 07:28:35

标签: java regex

假设我有这个字符串: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等不起作用 如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

您可以使用此正则表达式替换:

int n = 3 // or whatever number;
String repl = "";

if (n > 0) {
   repl = str.replaceAll("((\\S)\\2{" + (n-1) + "})\\2*", "$1");
}

示例:(对于N = 3)

RegEx Demo 1

示例:(对于N = 2)

RegEx Demo 2

<强>解释

  • (:启动捕获组#1
  • (\S):匹配1 +非空白字符并捕获为组#2
  • \2{2}:匹配同一个字符的2个实例
  • ):结束捕获组#1
  • \2*:匹配捕获组外的相同字符的0 +个实例

Code Demo

答案 1 :(得分:1)

使用以下正则表达式作为外观:

(\\w)(\\1{N})\\1*

故障:

  • (\w)匹配并捕获一封信给捕获组1
  • (\1{N})匹配之前捕获的字母N次(捕获第2组)
  • \1*匹配任意数量的以下重复

N 是您需要保留的字母数(您可以将其用作变量。0会产生空输出)并替换使用:

$2

Regex live demo

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*零次或多次
  • 然后检查匹配的长度是否大于或等于你的长度,如果是,请使用substring来获得你想要的长度。
  • 否则按原样使用匹配的字符。