Устранение неполадок
\w
не соответствует символам кириллицы. Я решил это, напечатав соответствующие группы в вашем цикле while:
System.out.println(m.group());
Напечатано:
Когда
I
был
моложе
I
никогда
необходимо
Ни одно из других слов не найдено.
Решение 1
Для сопоставления символов кириллицы вы также можете использовать \p{L}
. Если вы используете {3}
для соответствия трем символам, вы можете избежать проверки длины в цикле. \b
соответствует граничному символу. Все вместе:
public static String convert(String input) {
StringBuilder sb = new StringBuilder(input);
Pattern p = Pattern.compile("\\b\\p{L}{3}");
Matcher m = p.matcher(input);
while (m.find()) {
char firstChar = sb.charAt(m.start());
if (Character.isUpperCase(firstChar)) {
sb.setCharAt(m.start(), Character.toLowerCase(firstChar));
} else {
sb.setCharAt(m.start(), Character.toUpperCase(firstChar));
}
}
return sb.toString();
}
Производит:
когда я был моложе
мне никогда не было нужно
прощай, со Всех Вокзалов Поезда
Уходят в дальниекрая
Решение 2
Или, если вы хотите быть действительно swish, используйте позитивный взгляд (группа без захвата) и совпадение replaceAll
метод, который принимает лямбду:
public static String convert(String input) {
Pattern p = Pattern.compile("\\b(\\p{L})(?=\\p{L}{2})");
Matcher m = p.matcher(input);
return m.replaceAll(match -> {
char ch = match.group().charAt(0);
if (Character.isUpperCase(ch)) {
return "" + Character.toLowerCase(ch);
}
return "" + Character.toUpperCase(ch);
});
}
Также выдает:
когда я был моложе
мне никогда не нужно
прощай, со Всех Вокзалов Поезда
Уходятв дальние края