Это делает буквально , что вы просили, и ничего более. Однако, если вы действительно хотите реализовать перенос слов, это не очень хороший подход.
String str = "Hello how are you today music fine.This is a new line";
String parsedStr = str.replaceFirst("^(.*?)\\s*((\\S(?!\\s))*(?<=.{50}).*$)",
"$1"+System.lineSeparator()+"$2");
String [] pieces = parsedStr.split(System.lineSeparator());
for(String piece : pieces ) {
System.out.format("length %2d: \"%s\"%n", piece.length(), piece);
}
Выход:
длина 48: «Привет, как дела сегодня, музыка прекрасна. Это новая»
длина 4: «линия»
Пояснение:
^ =
начало строки (начало группы 1)
.*? =
неохотно сопоставляют любое количество символов (конечная группа 1)
\s* =
поглотить все пробелы, где будет разбиваться строка (начало группы 2)
\S* =
соответствует любому количеству непробельных символов ...
(?!\\s) =
НЕ сопровождается пробелами, иначе мы упустили бы шанс разделения точно на 50
(?<=.{50}) =
позитивный просмотр ровно 50 символов
.*$ =
включает все оставшиеся символы в строке (конечная группа 2)
Более простой вариант:
Вы можете получить очень похожие результаты с этим гораздо более простым регулярным выражением:
String parsedStr = str.replaceFirst("^(.{0,50})\\s+",
"$1"+System.lineSeparator());
(кредиты ctwheels за аналогичное предложение)
Единственное отличие состоит в том, что этот может закончиться дополнительным пробелом в конце строки 1, если до разделения было несколько пробелов. Но это не плохо.