Вам не нужно split
-tranform-join для этого;replaceAll
может сделать это за один шаг.
String text = "Skriv in en normal text:";
text = text.replaceAll("(\\s*)(\\w)(\\w+)", "$1$3$2");
System.out.println(text);
// prints "krivS ni ne ormaln extt:"
По сути, регулярное выражение охватывает 3 группы:
\1 : (\s*) : any optional preceding whitespace
\2 : (\w) : the head portion of each "word"
\3 : (\w+) : any tail portion of each "word"
Затем, когда строка замены делает это очевидным и понятным, вы переключаетесь \2
и \3
около.
Таким образом, должно быть ясно, что replaceAll
с группой захвата является лучшим, наиболее читаемым решением для этой проблемы, но что это регулярное выражение зависит от спецификации проблемы,Обратите внимание, что, например, вышеприведенное регулярное выражение преобразует text:
в extt:
(т. Е. Двоеточие сохраняется там, где оно есть).
Следующий вариант разбивает пробельные символы \s
и переупорядочивает голову / хвостлюбая последовательность непробельных символов \S
.Это должно быть идентично вашему текущему решению split(" ")
-transform-join:
String text = "bob: !@#$ +-";
text = text.replaceAll("(\\s*)(\\S)(\\S+)", "$1$3$2");
System.out.println(text);
// prints "ob:b @#$! -+"
Этот вариант переключает любую последовательность символов \w+
слова, окруженную границей слова \b
.Если это то, что вам нужно, то это самое простое и удобочитаемое решение для работы.
String text = "abc:def!ghi,jkl mno";
text = text.replaceAll("\\b(\\w)(\\w+)\\b", "$2$1");
System.out.println(text);
// prints "bca:efd!hig,klj nom"
См. Также