Усеченная строка на ближайшей границе слова - PullRequest
9 голосов
/ 05 февраля 2009

Можно ли обрезать строку Java до ближайшей границы слова после ряда символов. Аналогична функции PHP wordwrap (), показанной в этом примере .

Ответы [ 4 ]

14 голосов
/ 05 февраля 2009

Используйте java.text.BreakIterator, что-то вроде этого:

String s = ...;
int number_chars = ...;
BreakIterator bi = BreakIterator.getWordInstance();
bi.setText(s);
int first_after = bi.following(number_chars);
// to truncate:
s = s.substring(0, first_after);
4 голосов
/ 05 февраля 2009

Вы можете использовать регулярное выражение

Matcher m = Pattern.compile("^.{0,10}\\b").matches(str);
m.find();
String first10char = m.group(0);
2 голосов
/ 12 мая 2012

При первом подходе вы получите длину, превышающую число_чаров. Если вам нужен точный максимум или меньше, например, для сообщения в Твиттере, см. Мою реализацию ниже.

Обратите внимание, что подход регулярного выражения использует пробел для разделения слов, в то время как 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;
        }
    }
0 голосов
/ 06 марта 2018

Решение с BreakIterator не совсем простое, когда ломать предложение - это URL, оно ломает URL не очень хорошим способом Я скорее использовал мое решение:

public static String truncateText(String text, int maxLength) {
    if (text != null && text.length() < maxLength) {
        return text;
    }
    List<String> words = Splitter.on(" ").splitToList(text);
    List<String> truncated = new ArrayList<>();
    int totalCount = 0;
    for (String word : words) {
        int wordLength = word.length();
        if (totalCount + 1 + wordLength > maxLength) { // +1 because of space
            break;
        }
        totalCount += 1; // space
        totalCount += wordLength;
        truncated.add(word);
    }
    String truncResult = Joiner.on(" ").join(truncated);
    return truncResult + " ...";
}

Сплиттер / Столяр из гуавы. Я также добавляю ... в конце моего использования cas (может быть опущено).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...