我正在使用StringUtils.abbreviateMiddle(string, middle, targetLength);缩写中间的字符串,但使用此方法切断了单词.有没有一种方法,它只会在最接近弦的中间位置的空间切断弦?
public static String shortenStringMiddle(String string, String middle, int targetLength) {
targetLength = Math.abs(targetLength);
if (string != null && string.length() > targetLength) {
return StringUtils.abbreviateMiddle(string, middle, targetLength);
}
else {
return string;
}
}
Run Code Online (Sandbox Code Playgroud)
输入如果应用于此文本:
东南亚鱼虾养殖的疾病控制 - 诊断和畜牧技术:SEAFDEC-OIE研讨会论文集 - 东南亚鱼虾养殖疾病控制研讨会 - 诊断和畜牧技术,2001年12月4日至6日,伊洛伊洛市,菲律宾
System.out.println(StringUtils.abbreviateMiddle("Disease Control in Fish and Shrimp Aquaculture in Southeast Asia - Diagnosis and Husbandry Techniques: Proceedings of the SEAFDEC-OIE Seminar-Workshop on Disease Control in Fish and Shrimp Aquaculture in Southeast Asia - Diagnosis and Husbandry Techniques, 4-6 December 2001, Iloilo City, Philippines", " … ", 220));
Run Code Online (Sandbox Code Playgroud)
输出:
疾病控制在鱼和东南亚对虾养殖-诊断和饲养技术:Procee ... aculture东南亚-诊断和饲养技术,2001年12月4-6日,伊洛伊洛市,菲律宾
Proceedings这个词被Procee和Aquaculture 切割成了aculture
我理想的输出是:
东南亚鱼虾养殖的疾病控制 - 诊断和畜牧技术:会议记录......东南亚水产养殖 - 诊断和畜牧技术,2001年12月4日至6日,菲律宾伊洛伊洛市
我在这里搜索了SO,类似的问题只涉及在末尾添加省略号的缩写字符串.
这是另一个基于正则表达式的实现:
public static String abbreviateMiddle(String input, String middle, int length) {
if (input != null && input.length() > length) {
int half = (length - middle.length()) / 2;
Pattern pattern = Pattern.compile(
"^(.{" + half + ",}?)" + "\\b.*\\b" + "(.{" + half + ",}?)$");
Matcher matcher = pattern.matcher(input);
if (matcher.matches()) {
return matcher.group(1) + middle + matcher.group(2);
}
}
return input;
}
Run Code Online (Sandbox Code Playgroud)
根据您的示例文本,以下调用
System.out.println(abbreviateMiddle(exampleText, " ... ", 220));
Run Code Online (Sandbox Code Playgroud)
将产生
东南亚鱼虾水产养殖疾病控制 - 诊断和饲养技术:会议记录...东南亚水产养殖 - 诊断和饲养技术,2001 年 12 月 4-6 日,菲律宾伊洛伊洛市