Czy jest możliwe ucięcie łańcucha Java do najbliższej granicy słowa po liczbie znaków. Podobny do funkcji wordwrap() PHP, pokazanej w tym example.Skróć ciąg na najbliższej granicy słowa
8
A
Odpowiedz
14
Użyj java.text.BreakIterator
, coś takiego:
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
Można użyć wyrażenia regularnego
Matcher m = Pattern.compile("^.{0,10}\\b").matches(str);
m.find();
String first10char = m.group(0);
2
Przy pierwszym podejściu będzie w końcu o długości większej niż number_chars. Jeśli potrzebujesz dokładnego maksimum lub mniej, na przykład wiadomości na Twitterze, zobacz moją implementację poniżej.
Należy zauważyć, że podejście regexp używa spacji do rozdzielania słów, natomiast BreakIterator rozkłada wyrazy, nawet jeśli mają przecinki i inne znaki. Jest to bardziej pożądane.
Oto mój pełny funkcja:
/**
* 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
Rozwiązanie z BreakIterator
nie jest to proste, gdy łamiąc zdanie jest URL, przerywa URL nie bardzo miły sposób. Ja raczej użyłem roztworu kopalni:
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 jest z guawy. Dodaję także ...
na końcu mojego cas używania (można ommited).
Powiązane problemy
- 1. Regex używa granicy słowa, ale słowo kończy się na. (Kropka)
- 2. Skróć kolekcję
- 3. Wypełnienie na granicy div
- 4. Skróć NSString, aby dopasować rozmiar?
- 5. oddzielnych pomieszczeniach oddzielonych słowa ciąg
- 6. Skróć NSString do szerokości
- 7. Podziel tekst/ciąg w najbliższej przestrzeni w JavaScript
- 8. Generowanie wieloczęściowej granicy
- 9. Usuń pełne słowa zawierające ciąg w Vim
- 10. Ucinaj ciąg bez kończenia w środku słowa
- 11. Skróć JS jeśli lub oświadczenie
- 12. Znalezienie najbliższej pary punktów na kuli
- 13. zsh skróć długość bieżącej ścieżki
- 14. Przyciągaj do najbliższej ulicy
- 15. przekonwertować liczbę na słowa
- 16. css - koło z marginesem na granicy
- 17. SVG jako granicy obrazu na ekranach Retina
- 18. Rysuj na granicy ekranu w Commodore 64
- 19. UIView sub-widok na okładkę granicy?
- 20. Runda do najbliższej .25
- 21. Zaokrąglanie do najbliższej setki
- 22. Runda do najbliższej piątki
- 23. Jak podzielić słowa na litery w Pythonie
- 24. accessNotConfigured: Google URL Skróć API na symulatorze iOS
- 25. Jak kontrolować wysokość granicy?
- 26. Uzyskiwanie granicy okręgu
- 27. Rysowanie granicy tematycznej TEdit
- 28. jQuery CSS granicy
- 29. Podział łańcucha na słowa według wielu ograniczników
- 30. Co to jest granica bez słów w wyrażeniu regularnym (\ B), w porównaniu do granicy słowa?
To wielkie dzięki, chociaż czy bi a. TruncateAt() byłyby zbyt trudne do zapytania? :) –
Upewnij się, że test number_chars nie jest większy niż s.length(), w przeciwnym razie otrzymasz wyjątek. FYI, próbowałem edytować java, aby odzwierciedlić ten fakt, ale edycja została odrzucona. – mooreds