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

AMZ*_*ZFR 9 java string substring trim

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

快速的棕色狐狸跳过laz狗.

快棕...

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

快速...

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

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

谢谢,

Ali*_*Ali 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;
}
Run Code Online (Sandbox Code Playgroud)

更新

我已经更改了代码,以便...附加在StringBuffer中,这是为了防止String隐式的不必要的创建,这是缓慢而浪费的.

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

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

您可以删除它,代码应该工作相同.


Boh*_*ian 8

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

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

说明:

  • (?<=.{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);
}
Run Code Online (Sandbox Code Playgroud)

输出:

The quick brown...
Run Code Online (Sandbox Code Playgroud)


Tra*_*oai 5

请尝试以下代码:

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) + "...";
}
Run Code Online (Sandbox Code Playgroud)