首页 文章

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

提问于
浏览
9

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

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

快速的棕色......

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

快速...

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

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

谢谢,

7 回答

  • 8

    下面是我用来修剪webapps中的长字符串的方法 . 你设置"soft" 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;
    }
    

    Update

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

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

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

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

  • 0

    这是一个简单的,基于正则表达式的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...
    
  • 0

    请尝试以下代码:

    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) + "...";
    }
    
  • 11

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

  • 0

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

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

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

  • 4

    怎么样:

    mystring = mystring.replaceAll("^(.{12}.*?)\b.*$", "$1...");
    
  • 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))+ " ...";
            }
    

相关问题