Как усечь строку в groovy?
Я использовал:
def c = truncate("abscd adfa dasfds ghisgirs fsdfgf", 10)
но получив ошибку.
Как усечь строку в groovy?
Я использовал:
def c = truncate("abscd adfa dasfds ghisgirs fsdfgf", 10)
но получив ошибку.
Сообщество Groovy добавило метод take()
который можно использовать для простого и безопасного усечения строк.
Примеры:
"abscd adfa dasfds ghisgirs fsdfgf".take(10) //"abscd adfa"
"It groovy, man".take(4) //"It's"
"It groovy, man".take(10000) //"It groovy, man" (no exception thrown)
Также существует соответствующий метод drop()
:
"It groovy, man".drop(15) //"n"
"It groovy, man".drop(5).take(6) //"groovy"
И take()
и drop()
относятся к началу строки, как в "take from the front" и "drop from the front".
Консоль Groovy для запуска примеров:
https://ideone.com/zQD9Om - (примечание: пользовательский интерфейс очень плохой)
Дополнительную информацию см. В разделе "Добавить метод приема в коллекции, итераторы, массивы":
https://issues.apache.org/jira/browse/GROOVY-4865
В Groovy строки можно рассматривать как диапазоны символов. Как следствие, вы можете просто использовать функции индексирования диапазона Groovy и сделать myString[startIndex..endIndex]
.
В качестве примера,
"012345678901234567890123456789"[0..10]
выходы
"0123456789"
мы можем просто использовать функции индексирования диапазона Groovy и сделать someString[startIndex..endIndex].
Например:
def str = "abcdefgh"
def outputTrunc = str[2..5]
print outputTrunc
Консоль:
"cde"
Чтобы избежать разрыва слова, вы можете использовать java.text.BreakIterator. Это приведет к усечению строки к ближайшей границе слова после нескольких символов.
Пример
package com.example
import java.text.BreakIterator
class exampleClass {
private truncate( String content, int contentLength ) {
def result
//Is content > than the contentLength?
if(content.size() > contentLength) {
BreakIterator bi = BreakIterator.getWordInstance()
bi.setText(content);
def first_after = bi.following(contentLength)
//Truncate
result = content.substring(0, first_after) + "..."
} else {
result = content
}
return result
}
}
Здесь мой помощник выполняет эту проблему. Во многих случаях вы, вероятно, захотите усечь завязку, а не по-символам, поэтому я тоже вставил эту функцию.
public static String truncate(String self, int limit) {
if (limit >= self.length())
return self;
return self.substring(0, limit);
}
public static String truncate(String self, int hardLimit, String nonWordPattern) {
if (hardLimit >= self.length())
return self;
int softLimit = 0;
Matcher matcher = compile(nonWordPattern, CASE_INSENSITIVE | UNICODE_CHARACTER_CLASS).matcher(self);
while (matcher.find()) {
if (matcher.start() > hardLimit)
break;
softLimit = matcher.start();
}
return truncate(self, softLimit);
}