Ist es möglich, eine Java-Zeichenkette nach einer Anzahl von Zeichen auf die nächste Wortgrenze abzuschneiden. Ähnlich wie die PHP-Funktion wordwrap(), die in dieser example gezeigt wird.Zeichenkette an der nächsten Wortgrenze abschneiden
Antwort
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);
können Sie regelmäßig verwenden Ausdruck
Matcher m = Pattern.compile("^.{0,10}\\b").matches(str);
m.find();
String first10char = m.group(0);
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;
}
}
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).
- 1. Entspricht der nächsten Zeichenkette einer bestimmten Zeichenkette
- 2. Brechen Sie nicht-zusammengesetzte zusammengesetzte Wörter an der Wortgrenze
- 3. Android Landscape-Modus abschneiden meine Tasten an der Spitze
- 4. RegEx: Hinzufügen Pluszeichen Wortgrenze
- 5. zulassen UILabel Text zu kürzen, sondern an Wortgrenze
- 6. Tabelle innerhalb der Transaktion abschneiden
- 7. Abbrechen der Abfrage beim Abschneiden
- 8. Regex Wortgrenze Alternative
- 9. Regex Wortgrenze Verwirrung
- 10. Stdin Linienlänge abschneiden?
- 11. Datei abschneiden
- 12. Anhängen an eine bestehende Zeichenkette
- 13. Elemente der Matrix einen nächsten an Elementen der Array zwei
- 14. SSRS 2008 Textbox abschneiden Inhalt
- 15. MySQL regex für Wortgrenze enthält, ‚@‘
- 16. Abschneiden Datensatz nach Maximalwert
- 17. CGImageCreateWithImageInRect das Abschneiden
- 18. Abschneiden chinesischen Text
- 19. Puffern der Prozessausgabe, die Abschneiden verursacht?
- 20. Zeichenkette in der Webansicht
- 21. Bootstrap Drop-Down-Abschneiden
- 22. Regex Differenz zwischen Wortgrenze Ende und Kanten
- 23. Wie mehrere einzelne Zeichen an der Zeichenkette n - Zeit
- 24. Definieren Sie ein Zeichen als Wortgrenze
- 25. java httpurlconnection abschneiden html
- 26. Kamera Abschneiden Szene
- 27. Abschneiden vor SqlBulkCopy
- 28. Abschneiden Ellipse ohne Breite
- 29. Text in d3 abschneiden
- 30. Python:% s-Substitution an einer Zeichenkette verhindern
Das ist großartig danke, obwohl wäre aa bi.truncateAt() zu viel verlangt worden? :) –
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