При первом подходе вы получите длину, превышающую число_чаров. Если вам нужен точный максимум или меньше, например, для сообщения в Твиттере, см. Мою реализацию ниже.
Обратите внимание, что подход регулярного выражения использует пробел для разделения слов, в то время как BreakIterator разбивает слова, даже если они содержат запятые и другие символы. Это более желательно.
Вот моя полная функция:
/**
* Truncate text to the nearest word, up to a maximum length specified.
*
* @param text
* @param maxLength
* @return
*/
private String truncateText(String text, int maxLength) {
if(text != null && text.length() > maxLength) {
BreakIterator bi = BreakIterator.getWordInstance();
bi.setText(text);
if(bi.isBoundary(maxLength-1)) {
return text.substring(0, maxLength-2);
} else {
int preceding = bi.preceding(maxLength-1);
return text.substring(0, preceding-1);
}
} else {
return text;
}
}