如何将 Java 字符串分成两个,其中第一个子字符串不长于 x 并以整个单词结尾

How to divide a Java String into two where the first substring is no longer than x and ends with a whole word

我对将一个字符串分成 2 个子字符串不知所措。第一个子字符串的长度不应超过 35,并且应以单词结尾结束。因此,如果 35 限制落在单词中间,则在该单词开始时断开字符串(假设在 32 处)。按单词我的意思是非 space 字符的任何组合。单词除以 spaces。第二个子字符串可以是任意长度,因此应该以单词开头。该字符串始终大于 35,并且没有模式。我该如何实施?提前致谢!

示例:

"Lordem ipsum dolor sit amet, 0 cons(35 chars until here)ectetur adipiscing elit, №22sed 70 % do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."

这是一个长字符串。然后我需要得到字符串:"Lordem ipsum dolor sit amet, 0"(少于 35 并且在单词结束的地方结束),其余的变成一个单独的大子字符串

您可以使用以下方法并输入 35 以获得所需的结果。

public static String[] splitAtLengthOrBeforeWord(String s, int length) {
    if(length < 0) {
        throw new IllegalArgumentException("length must be greater than 0");
    }

    if(s.length() < length) {
        return new String[] { s, "" };
    }
    
    for(int i = length - 1; i >= 0; i--) {
        int c = s.charAt(i);
        if(Character.isWhitespace(c)) {
            return new String[] { s.substring(0, i), s.substring(i) };
        }
    }
    return new String[] { "", s };
}

您可以使用字符串 class 中的 lastindexOf 方法,首先检查索引 35 处的字符是否为 space 只是简单拆分,否则您可以拆分 35 并获取 space 的最后一个索引该索引将为您提供单词的开头,这就是我们试图弄清楚的。下面是处理此逻辑的代码。您可以根据需要添加其他安全检查。

    public static void main(String[] args) {
    String str = "Lordem ipsum dolor sit amet, 0 cons(35 chars until here)ectetur adipiscing elit, №22sed 70 % do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.";
    String str1, str2 = "";
    if (str.charAt(35) == ' ') {
        str1 = str.substring(0, 35);
        str2 = str.substring(36, str.length());
    }
    else {
        String temp = str.substring(0, 35);
        int ind = temp.lastIndexOf(' ');
        str1 = str.substring(0, ind);
        str2 = str.substring(ind + 1, str.length());
    }
    System.out.println(str1);
    System.out.println(str2);
   }

}

您可以使用 StringTokenizer:

import java.util.Arrays;
import java.util.StringTokenizer;

public class Test {

    public static void main(String[] args){
        String str = "Lordem ipsum dolor sit amet, 0 cons(35 chars until here)ectetur adipiscing elit, №22sed 70 % do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.";
        StringTokenizer strToken  = new StringTokenizer(str," ",true);
        String first  = "";
        String second = "";

        while(strToken.hasMoreTokens()){
            String next = strToken.nextToken();
            if((first+next).length() < 35){
                first += next;
            }
            else{
                break;
            }
            second = str.substring(first.length());
        }
        System.out.println(first);
        System.out.println(second);
    }
}

或者,如果您使用的是 java 9 或更高版本并且想尝试直播:

import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

public class Test {

    public static void main(String[] args){
        String str = "Lordem ipsum dolor sit amet, 0 cons(35 chars until here)ectetur adipiscing elit, №22sed 70 % do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.";

        //split at space and keep delimiters
        String[] splited = str.split("((?<= )|(?= ))");

        AtomicInteger ai = new AtomicInteger(0);
        String f = Arrays.stream(splited).takeWhile(i -> ai.addAndGet(i.length()) < 35).collect(Collectors.joining());

        AtomicInteger bi = new AtomicInteger(0);
        String s = Arrays.stream(splited).dropWhile(i -> bi.addAndGet(i.length()) < 35).collect(Collectors.joining());

        System.out.println(f);
        System.out.println(s);
    }
}