Groovyで文字列を切り捨てる方法は?
私が使用した:
def c = truncate("abscd adfa dasfds ghisgirs fsdfgf", 10)
エラーが発生しました。
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
Groovyでは、文字列は文字の範囲と見なすことができます。結果として、Groovyの範囲インデックス機能を使用してmyString[startIndex..endIndex]
。
例として、
"012345678901234567890123456789"[0..10]
出力
"0123456789"
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
}
}
groovyの範囲インデックス機能を使用してsomeString[startIndex..endIndex].
例えば:
def str = "abcdefgh"
def outputTrunc = str[2..5]
print outputTrunc
コンソール:
"cde"
このような問題を解決するためのヘルパー関数を次に示します。多くの場合、文字単位ではなく単語単位で切り捨てるので、そのための関数も貼り付けました。
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);
}