如何将 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);
}
}
我对将一个字符串分成 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);
}
}