2009-02-05 9 views

Antwort

14

Verwenden Sie ein java.text.BreakIterator, etwa so:

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); 
+0

Das ist großartig danke, obwohl wäre aa bi.truncateAt() zu viel verlangt worden? :) –

+0

Stellen Sie sicher, dass Sie testen, dass number_chars nicht größer als s.length() ist, sonst erhalten Sie eine Ausnahme. FYI, ich habe versucht, das Java zu bearbeiten, um diese Tatsache widerzuspiegeln, aber die Änderung wurde zurückgewiesen. – mooreds

4

können Sie regelmäßig verwenden Ausdruck

Matcher m = Pattern.compile("^.{0,10}\\b").matches(str); 
m.find(); 
String first10char = m.group(0); 
2

Mit dem ersten Ansatz werden Sie mit einer Länge größer als number_chars enden. Wenn Sie ein genaues Maximum oder weniger benötigen, wie für eine Twitter-Nachricht, finden Sie unten meine Implementierung.

Beachten Sie, dass der Regexp-Ansatz ein Leerzeichen zum Abgrenzen der Wörter verwendet, während BreakIterator Wörter aufteilt, auch wenn sie Kommas und andere Zeichen enthalten. Dies ist wünschenswerter.

Hier ist meine volle Funktion:

/** 
    * 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

Lösung mit BreakIterator nicht wirklich einfach ist, wenn Satz zu brechen URL ist, es bricht URL nicht sehr schön Art und Weise. Ich benutze lieber meine Lösung:

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 + " ..."; 
} 

Splitter/Joiner ist aus Guava. Ich füge auch ... am Ende in meinem Gebrauch cas hinzu (kann weggelassen werden).