Как усечь строку в groovy?

Как усечь строку в groovy?

Я использовал:

def c = truncate("abscd adfa dasfds ghisgirs fsdfgf", 10)

но получив ошибку.

Ответ 1

Сообщество 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

Ответ 2

В Groovy строки можно рассматривать как диапазоны символов. Как следствие, вы можете просто использовать функции индексирования диапазона Groovy и сделать myString[startIndex..endIndex].

В качестве примера,

"012345678901234567890123456789"[0..10]

выходы

"0123456789"

Ответ 3

мы можем просто использовать функции индексирования диапазона Groovy и сделать someString[startIndex..endIndex].

Например:

def str = "abcdefgh"
def outputTrunc = str[2..5]
print outputTrunc

Консоль:

"cde"

Ответ 4

Чтобы избежать разрыва слова, вы можете использовать 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
    }
}

Ответ 5

Здесь мой помощник выполняет эту проблему. Во многих случаях вы, вероятно, захотите усечь завязку, а не по-символам, поэтому я тоже вставил эту функцию.

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);
}