В Java 9+, используя регулярное выражение для поиска последовательных символов, будет делать следующее:
static String shorten(String input) {
return Pattern.compile("(.)\\1+").matcher(input)
.replaceAll(r -> r.group(1) + r.group().length());
}
Тест
System.out.println(shorten("ggggeecaaaaaaaaaaaa"));
System.out.println(shorten("ggggee???????"));
Вывод
g4e2ca12
g4e2?6?8
Однако, как вы можете видеть, этот код не работает, если входная строка содержит символы Unicode из дополнительных плоскостей, например символы Emoji.
Небольшая модификация исправит это:
static String shorten(String input) {
return Pattern.compile("(.)\\1+").matcher(input)
.replaceAll(r -> r.group(1) + r.group().codePointCount(0, r.group().length()));
}
Или:
static String shorten(String input) {
return Pattern.compile("(.)\\1+").matcher(input)
.replaceAll(r -> r.group(1) + input.codePointCount(r.start(), r.end()));
}
Выход
g4e2ca12
g4e2?3?4