在Java中修剪字符串,同时保留完整的单词

时间:2011-10-12 09:47:07

标签: java string substring trim

我需要修剪java中的String,以便:

  

快速的棕色狐狸跳过懒狗。

变为

  

快速的棕色......

在上面的示例中,我正在修剪为12个字符。如果我只使用子字符串,我会得到:

  

快速br ...

我已经有了使用子字符串执行此操作的方法,但我想知道什么是最快(最有效)的方法,因为页面可能有很多修剪操作。

我能想到的唯一方法是将字符串拆分为空格并将其重新组合,直到其长度超过给定长度。还有其他方法吗?也许是一种更有效的方法,我可以使用相同的方法来执行“软”修剪,其中我保留最后一个单词(如上例所示)和硬修剪,这几乎是一个子字符串。

谢谢,

7 个答案:

答案 0 :(得分:11)

下面是我用来修剪webapps中的长字符串的方法。 你设置的“软”boolean如果设置为true将保留最后一个单词。 这是我做到的最简洁的方法,我可以使用StringBuffer,它比重新创建一个不可变的字符串更有效。

public static String trimString(String string, int length, boolean soft) {
    if(string == null || string.trim().isEmpty()){
        return string;
    }

    StringBuffer sb = new StringBuffer(string);
    int actualLength = length - 3;
    if(sb.length() > actualLength){
        // -3 because we add 3 dots at the end. Returned string length has to be length including the dots.
        if(!soft)
            return escapeHtml(sb.insert(actualLength, "...").substring(0, actualLength+3));
        else {
            int endIndex = sb.indexOf(" ",actualLength);
            return escapeHtml(sb.insert(endIndex,"...").substring(0, endIndex+3));
        }
    }
    return string;
}

<强>更新

我已经更改了代码,以便在{String}字符串中附加...,这是为了防止String的不必要的创建,这是非常缓慢和浪费的。

注意: escapeHtml是来自apache commons的静态导入:

import static org.apache.commons.lang.StringEscapeUtils.escapeHtml;

您可以将其删除,代码应该可以正常工作。

答案 1 :(得分:8)

这是一个简单的,基于正则表达式的1行解决方案:

str.replaceAll("(?<=.{12})\\b.*", "..."); // How easy was that!? :)

说明:

  • (?<=.{12})背后的负面看法,它断言匹配的左边至少有12个字符,但它是非捕获的(即零宽度)匹配
  • \b.*匹配第一个单词边界(在至少12个字符之后 - 上面)到结尾

将其替换为“...”

这是一个测试:

public static void main(String[] args) {
    String input = "The quick brown fox jumps over the lazy dog.";
    String trimmed = input.replaceAll("(?<=.{12})\\b.*", "...");
    System.out.println(trimmed);
}

输出:

The quick brown...

答案 2 :(得分:4)

请尝试以下代码:

private String trim(String src, int size) {
    if (src.length() <= size) return src;
    int pos = src.lastIndexOf(" ", size - 3);
    if (pos < 0) return src.substring(0, size);
    return src.substring(0, pos) + "...";
}

答案 3 :(得分:0)

尝试通过添加“...”来搜索位置小于或大于11的空间的最后一次出现并修剪其中的字符串。

答案 4 :(得分:0)

您的要求不明确。如果您无法用自然语言表达它们,那么将它们翻译成像Java这样的计算机语言就不足为奇了。

“保留最后一个单词”意味着算法将知道“单词”是什么,所以你必须首先告诉它。分裂是一种方法。带语法的扫描仪/解析器是另一种。

在我关注效率之前,我担心让它发挥作用。让它工作,测量它,然后看看你可以做些什么关于性能。其他一切都是没有数据的猜测。

答案 5 :(得分:0)

怎么样:

mystring = mystring.replaceAll("^(.{12}.*?)\b.*$", "$1...");

答案 6 :(得分:0)

我使用这个hack:假设修剪过的字符串必须有120个长度:

String textToDisplay = textToTrim.substring(0,(textToTrim.length() > 120) ? 120 : textToTrim.length());

        if (textToDisplay.lastIndexOf(' ') != textToDisplay.length() &&textToDisplay.length()!=textToTrim().length()) {

            textToDisplay = textToDisplay + textToTrim.substring(textToDisplay.length(),textToTrim.indexOf(" ", textToDisplay.length()-1))+ " ...";
        }