Да, вы можете использовать группы регулярных выражений для достижения этой цели. Примерно так:
final Pattern pattern = Pattern.compile("([a-z]{5})([a-z]{4})([a-z]{6})([a-z]{3})");
final Matcher matcher = pattern.matcher("abcdefghijklmnopqr");
if (matcher.matches()) {
String first = matcher.group(0);
String second = matcher.group(1);
String third = matcher.group(2);
String fourth = matcher.group(3);
return first + " " + second + " " + third + " " + fourth;
} else {
throw new SomeException();
}
Обратите внимание, что шаблон должен быть константой, здесь я использовал локальную переменную, чтобы было легче читать.
По сравнению с подстроками, который также будет работать для достижения желаемого результата, регулярное выражение также позволит вам проверить формат ваших входных данных. В приведенном примере вы проверяете, что это строка длиной 18 символов, состоящая только из строчных букв.
Если у вас есть более интересные примеры, например, с сочетанием букв и цифр, вы можете проверить, что каждая группа содержит правильный тип данных с регулярным выражением.
Вы также можете сделать более простая версия, в которой вы просто заменяете на:
"abcdefghijklmnopqr".replaceAll("([a-z]{5})([a-z]{4})([a-z]{6})([a-z]{3})", "$1 $2 $3 $4")
Но вы не можете проверить, потому что если строка не соответствует формату, она просто не будет заменена, и это менее эффективно, чем подстроки .
Вот пример решения с использованием подстрок, который был бы более эффективным, если вам не нужна проверка:
final Set<Integer> breaks = Set.of(5, 9, 15);
final String str = "abcdefghijklmnopqr";
final StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
if (breaks.contains(i)) {
stringBuilder.append(' ');
}
stringBuilder.append(str.charAt(i));
}
return stringBuilder.toString();