首页 > 解决方案 > 如何将 Java 字符串分成两个,其中第一个子字符串不超过 x 并以整个单词结尾

问题描述

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

例子:

“Lordem ipsum dolor sit amet, $200 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, $200"少于 35 个并在单词结束的地方结束),其余的进入一个单独的大子字符串

标签: javastringsplitsubstring

解决方案


您可以使用 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, $200 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, $200 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);
    }
}

推荐阅读