Как сделать чтобы небуквенные символы в слове оставались на своих местах, а буквы были реверсированные в Java?

Нужно реверсировать слова, чтобы небуквенные символы остались на своих местах.

Вот пример кода с реверсом слова:

public class Reverse {
    public static void main(String[] args) {
        System.out.println(reverse("Hello World!"));
    }
    
    public static String reverse(String input) {        
        String inputWords[] = input.split(" ");
        String outputWords[] = new String[inputWords.length];
        int i = 0;

        for (String inputWord : inputWords) {
            String reverse = new StringBuilder(inputWord).reverse().toString();
            outputWords[i] = reverse;
            i++;
        }

        return String.join(" ", outputWords);
    }
}

Как изменить код чтобы символы оставались на своих местах?


Ответы (1 шт):

Автор решения: Alexey R.

Можно так:

class Reverse {
    public static void main(String[] args) {
        System.out.println(reverse("Hel!lo, Wo~~rld!"));
    }

    public static String reverse(String input) {
        Pattern p = Pattern.compile("([a-zA-Z]+)([^a-zA-Z]*)");
        Matcher m = p.matcher(input);
        StringBuilder result = new StringBuilder();
        while(m.find()){
            String word = m.group(1);
            String nonWord = m.group(2);
            if(word != null){
                result.append(new StrBuilder(word).reverse().toString());
            }
            if(nonWord != null){
                result.append(nonWord);
            }
        }
        return result.toString();
    }
}

Вывод:

leH!ol, oW~~dlr!
→ Ссылка