Как обрезать строку в заводной? - PullRequest
33 голосов
/ 12 июля 2010

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

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

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

но получаю ошибку.

Ответы [ 5 ]

69 голосов
/ 30 марта 2013

Сообщество Groovy добавило метод take(), который можно использовать для простого и безопасного усечения строк.

Примеры:

"abscd adfa dasfds ghisgirs fsdfgf".take(10)  //"abscd adfa"
"It's groovy, man".take(4)      //"It's"
"It's groovy, man".take(10000)  //"It's groovy, man" (no exception thrown)

Существует также соответствующий drop() метод:

"It's groovy, man".drop(15)         //"n"
"It's groovy, man".drop(5).take(6)  //"groovy"

И take(), и drop() относятся к началу строки, как в "взять с фронта" и "падение с фронта" .

Онлайн Groovy консоль для запуска примеров:
https://ideone.com/zQD9Om & mdash; (примечание: интерфейс действительно плохой)

Для получения дополнительной информации см. «Добавление метода получения к коллекциям, итераторам, массивам» :
https://issues.apache.org/jira/browse/GROOVY-4865

8 голосов
/ 12 июля 2010

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

Например,

"012345678901234567890123456789"[0..10]

вывод

"0123456789"
1 голос
/ 07 июня 2016

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

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

Например:

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

Консоль:

"cde"
0 голосов
/ 08 июня 2015

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

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