时间:2010-07-12 07:11:28

标签: groovy truncate

如何在groovy中截断字符串?

我用过:

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

但是收到错误。

5 个答案:

答案 0 :(得分:67)

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 - (注意:用户界面非常糟糕)

有关其他信息,请参阅“向集合,迭代器,数组添加获取方法”
https://issues.apache.org/jira/browse/GROOVY-4865

答案 1 :(得分:8)

在Groovy中,字符串可以被视为字符范围。因此,您可以简单地使用Groovy的范围索引功能并执行myString[startIndex..endIndex]

举个例子,

"012345678901234567890123456789"[0..10]

输出

"0123456789"

答案 2 :(得分:1)

我们可以简单地使用Groovy的范围索引功能并执行someString[startIndex..endIndex].

例如:

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

控制台:

"cde"

答案 3 :(得分:1)

为避免分词,您可以使用 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
    }
}

答案 4 :(得分:0)

这是我帮助函数来解决这个问题。在许多情况下,您可能希望截断by-word而不是by-characters,所以我也粘贴了该函数。

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