Проблема возникает из-за того, как replaceAll работает. То, что происходит, происходит после того, как каждый раз, когда он заменяет раздел, он начинает смотреть после раздела, которому он соответствует, например, когда ваш шаблон запускается, вы получаете результат
this is t with f array
То, что происходит внутри, это:
- сопоставить шаблон с "это массив с u"
- совпадение найдено в "t"
- заменить на "".
- Начать сопоставление после последнего сопоставления ("f with u f array")
- Примечание. "F" не соответствует, потому что нет начального пробела.
То, что вам нужно, - это трюк, называемый «положительный прогноз нулевой ширины». Если вы используете шаблон:
(\\s+[a-z](?=\\s))
Второе место гласит: «Попробуй сопоставить, но на самом деле не считай это частью матча». Поэтому, когда произойдет следующее совпадение, оно сможет использовать это пространство как часть своего совпадения.
Вам также нужно заменить на пустую строку, так как завершающий пробел не удаляется, т.е.
"this is a t f with u f array".replaceAll("(\\s+[a-z](?=\\s))","")