有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何将一个Java字符串一分为二,其中第一个子字符串不超过x,并以一个完整的单词结尾

把一个字符串分成两个子字符串让我不知所措。第一个子串的长度不应超过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个,在单词结尾处结束),其余的放入一个大的独立子字符串中


共 (2) 个答案

  1. # 1 楼答案

    您可以使用以下方法来输入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 };
    }
    
  2. # 2 楼答案

    您可以使用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或更高版本,并且想要尝试streams:

    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);
        }
    }