如何在不切割单词的情况下在中间缩写字符串

eul*_*ler 6 java string

我正在使用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,类似的问题只涉及在末尾添加省略号的缩写字符串.

Rob*_*sen 3

这是另一个基于正则表达式的实现:

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 日,菲律宾伊洛伊洛市