Вы также можете использовать lookarounds.
test.replaceAll("^ +| +$|(?<= ) ", "");
OR
test.replaceAll("^ +| +$| (?= )", "")
<space>(?= )
соответствует пробелу, за которым следует еще один пробел. Таким образом, в последовательных пробелах он будет соответствовать всем пробелам, кроме последнего, поскольку за ним не следует пробел. Это оставит вам один пробел для последовательных пробелов после операции удаления.
Пример:
String[] tests = {
" x ", // [x]
" 1 2 3 ", // [1 2 3]
"", // []
" ", // []
};
for (String test : tests) {
System.out.format("[%s]%n",
test.replaceAll("^ +| +$| (?= )", "")
);
}