web-dev-qa-db-ja.com

Groovyで文字列を切り捨てる方法は?

Groovyで文字列を切り捨てる方法は?

私が使用した:

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

エラーが発生しました。

38
Srinath

Groovyコミュニティーには、take()メソッドが追加されました。これは、簡単かつsafe文字列の切り捨てに使用できます。

例:

_"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 from the front" /のように、take()drop()はどちらも文字列のstartを基準にしています。および"正面からドロップ"

サンプルを実行するオンラインGroovyコンソール:
https://ideone.com/zQD9Om(注:UIは本当に悪い)

追加情報については、"コレクションへのテイクメソッドの追加、イテレータ、配列"を参照してください。
https://issues.Apache.org/jira/browse/GROOVY-4865

79
Dem Pilafian

Groovyでは、文字列は文字の範囲と見なすことができます。結果として、Groovyの範囲インデックス機能を使用してmyString[startIndex..endIndex]

例として、

"012345678901234567890123456789"[0..10]

出力

"0123456789"
8
Riduidel

Wordの改行を回避するには、Java.text.BreakIteratorを使用できます。これにより、文字列の後に、最も近いWord境界まで文字列が切り捨てられます。

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
    }
}
2
Tyler Rafferty

groovyの範囲インデックス機能を使用してsomeString[startIndex..endIndex].

例えば:

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

コンソール:

"cde"
1
Vikash Kumar

このような問題を解決するためのヘルパー関数を次に示します。多くの場合、文字単位ではなく単語単位で切り捨てるので、そのための関数も貼り付けました。

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