Заменить пробелы перед знаками препинания

Пользователь вводит какой нибудь текст

System.out.println("   привет   ,   как    дела  ?   ");

Как используя replaceAll на выходе получить "привет, как дела?", что бы удалить все пробелы, я использую trim() и регулярки, но проблема в удаление пробелов перед знаками препинания, то есть я хочу взять "\\s\\p{Punct}" и заменить пробел со знаком пунктуации, только на знак пунктуации без пробела

String result = input.replaceAll("(\\s+)" , " ").replaceAll("\\s\\p{Punct}" , " ");

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

Автор решения: And
String s = "   привет   ,   как    дела  ?   ";
System.out.println(s.replaceAll("\\s+", " ").replaceAll("\\s(\\p{Punct})","$1").trim());

Вывод:

привет, как дела?

→ Ссылка
Автор решения: StateItPrimitive

Если вдруг будет интересен альтернативный способ решения задачи, то можно сделать следующим образом:

public class Example {
    public static void main(String[] args) {
        System.out.println(modify("   привет   ,   как    дела  ?   "));
    }

    private static String modify(String original) {
        return original.trim()
                       .replaceAll("\\s+", " ")
                       .replaceAll("\\s(?=\\p{Punct})", "");
    }
}

Здесь используется non-capturing group via zero-width positive lookahead.

→ Ссылка