我需要修剪java中的String,以便:
快速的棕色狐狸跳过懒狗。
变为
快速的棕色......
在上面的示例中,我正在修剪为12个字符。如果我只使用子字符串,我会得到:
快速br ...
我已经有了使用子字符串执行此操作的方法,但我想知道什么是最快(最有效)的方法,因为页面可能有很多修剪操作。
我能想到的唯一方法是将字符串拆分为空格并将其重新组合,直到其长度超过给定长度。还有其他方法吗?也许是一种更有效的方法,我可以使用相同的方法来执行“软”修剪,其中我保留最后一个单词(如上例所示)和硬修剪,这几乎是一个子字符串。
谢谢,
答案 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))+ " ...";
}