Причина, по которой вы заменяете только один элемент, состоит в том, что вы соответствуете всей строке. Регулярное выражение, которое вы используете "(?imc)(.+)\\s*\\+\\s*(.+)"
, соответствует чему-либо (.+)
до конца, затем возвращается, поэтому оно может соответствовать остальным \\s*\\+...
. Так что в основном ваша группа 1 +. Почти все, но последний + и далее. Следовательно, replaceAll может совпадать только один раз и завершится после этой замены.
То, что вам нужно, это замена, которая находит +
, необязательно заключенную в пробелы:
Pattern.compile("(?imc)\\s*\\+\\s*");
Это должно соответствовать всем, что вы хотите сопоставить, и не соответствует всей строке, а только вашему замещающему символу.