Вы просто разделяете пробелы, что делает каждую последовательность непробельных символов «словом».
Это задание является каноническим вариантом использования регулярного выражения Matcher
appendReplacement
/ appendTail
цикл, который вы всегда можете использовать, когда предполагаемая логика замены слишком сложна для простого replaceAll(String regex, String replacement)
на String
:
static final Pattern WORD = Pattern.compile("\\pL+"); // class "L" means "letter"
static String reverseWords(String inputString) {
Matcher m = WORD.matcher(inputString);
if(!m.find()) return inputString;
StringBuffer sb = new StringBuffer(inputString.length());
do {
m.appendReplacement(sb, new StringBuilder(m.group()).reverse().toString());
} while(m.find());
return m.appendTail(sb).toString();
}
(Начиная с Java 9, этот API также поддерживает использование StringBuilder
вместо StringBuffer
.
Но в этом конкретном случае эту операцию также можно сделать несколько более эффективной:
static String reverseWords(String inputString) {
Matcher m = WORD.matcher(inputString);
if(!m.find()) return inputString;
StringBuilder sb = new StringBuilder(inputString);
do {
for(int ix1 = m.start(), ix2 = m.end() - 1; ix1 < ix2; ix1++, ix2--) {
sb.setCharAt(ix1, inputString.charAt(ix2));
sb.setCharAt(ix2, inputString.charAt(ix1));
}
} while(m.find());
return sb.toString();
}