如何在 Java 中每第 n 次出现字符时拆分字符串
How to split string at every nth occurrence of character in Java
我想在每第 4 次出现逗号时拆分字符串 ,
。
如何做到这一点?下面是一个例子:
String str = "1,,,,,2,3,,1,,3,,";
Expected output:
array[0]: 1,,,,
array[1]: ,2,3,,
array[2]: 1,,3,,
我试过像这样使用 Google Guava:
Iterable<String> splitdata = Splitter.fixedLength(4).split(str);
output: [1,,,, ,,2,, 3,,1, ,,3,, ,]
我也试过这个:
String [] splitdata = str.split("(?<=\G.{" + 4 + "})");
output: [1,,,, ,,2,, 3,,1, ,,3,, ,]
但这不是我想要的输出。我只想在每第 4 次出现逗号时拆分字符串。
谢谢。
取两个int变量。一是统计','的个数。如果出现 ',' 则计数将移动。如果计数达到 4,则将其重置为 0。另一个 int 值将指示从何处截断字符串。它将从 0 开始,在检测到第一个字符串后,终点(字符串中的字符位置)将成为下一个字符串的第一个点。使用此起点和当前终点(i+1,因为在事件发生后 i 值将递增)。最后将字符串添加到数组列表中。这是一个示例代码。希望这会帮助你。抱歉我的英语不好。
String str = "1,,,,,2,3,,1,,3,,";
int k = 0;
int startPoint = 0;
ArrayList<String> arrayList = new ArrayList<>();
for (int i = 0; i < str.length(); i++)
{
if (str.charAt(i) == ',')
{
k++;
if (k == 4)
{
String ab = str.substring(startPoint, i+1);
System.out.println(ab);
arrayList.add(ab);
startPoint = i+1;
k = 0;
}
}
}
如果你想在数组中得到结果,也试试这个
String str = "1,,,,,2,3,,1,,3,,";
System.out.println(str);
char c[] = str.toCharArray();
int ptnCnt = 0;
for (char d : c) {
if(d==',')
ptnCnt++;
}
String result[] = new String[ptnCnt/4];
int i=-1;
int beginIndex = 0;
int cnt=0,loopcount=0;
for (char ele : c) {
loopcount++;
if(ele==',')
cnt++;
if(cnt==4){
cnt=0;
result[++i]=str.substring(beginIndex,loopcount);
beginIndex=loopcount;
}
}
for (String string : result) {
System.out.println(string);
}
这里有一个更灵活的函数,使用了 this answer 的想法:
static List<String> splitAtNthOccurrence(String input, int n, String delimiter) {
List<String> pieces = new ArrayList<>();
// *? is the reluctant quantifier
String regex = Strings.repeat(".*?" + delimiter, n);
Matcher matcher = Pattern.compile(regex).matcher(input);
int lastEndOfMatch = -1;
while (matcher.find()) {
pieces.add(matcher.group());
lastEndOfMatch = matcher.end();
}
if (lastEndOfMatch != -1) {
pieces.add(input.substring(lastEndOfMatch));
}
return pieces;
}
这就是您使用示例的调用方式:
String input = "1,,,,,2,3,,1,,3,,";
List<String> pieces = splitAtNthOccurrence(input, 4, ",");
pieces.forEach(System.out::println);
// Output:
// 1,,,,
// ,2,3,,
// 1,,3,,
我使用 Guava 中的 Strings.repeat
。
这项工作完美无缺,并在 Java 8
中进行了测试
public String[] split(String input,int at){
String[] out = new String[2];
String p = String.format("((?:[^/]*/){%s}[^/]*)/(.*)",at);
Pattern pat = Pattern.compile(p);
Matcher matcher = pat.matcher(input);
if (matcher.matches()) {
out[0] = matcher.group(1);// left
out[1] = matcher.group(2);// right
}
return out;
}
//Ex: D:/folder1/folder2/folder3/file1.txt
//if at = 2, group(1) = D:/folder1/folder2 and group(2) = folder3/file1.txt
我想在每第 4 次出现逗号时拆分字符串 ,
。
如何做到这一点?下面是一个例子:
String str = "1,,,,,2,3,,1,,3,,";
Expected output:
array[0]: 1,,,,
array[1]: ,2,3,,
array[2]: 1,,3,,
我试过像这样使用 Google Guava:
Iterable<String> splitdata = Splitter.fixedLength(4).split(str);
output: [1,,,, ,,2,, 3,,1, ,,3,, ,]
我也试过这个:
String [] splitdata = str.split("(?<=\G.{" + 4 + "})");
output: [1,,,, ,,2,, 3,,1, ,,3,, ,]
但这不是我想要的输出。我只想在每第 4 次出现逗号时拆分字符串。
谢谢。
取两个int变量。一是统计','的个数。如果出现 ',' 则计数将移动。如果计数达到 4,则将其重置为 0。另一个 int 值将指示从何处截断字符串。它将从 0 开始,在检测到第一个字符串后,终点(字符串中的字符位置)将成为下一个字符串的第一个点。使用此起点和当前终点(i+1,因为在事件发生后 i 值将递增)。最后将字符串添加到数组列表中。这是一个示例代码。希望这会帮助你。抱歉我的英语不好。
String str = "1,,,,,2,3,,1,,3,,";
int k = 0;
int startPoint = 0;
ArrayList<String> arrayList = new ArrayList<>();
for (int i = 0; i < str.length(); i++)
{
if (str.charAt(i) == ',')
{
k++;
if (k == 4)
{
String ab = str.substring(startPoint, i+1);
System.out.println(ab);
arrayList.add(ab);
startPoint = i+1;
k = 0;
}
}
}
如果你想在数组中得到结果,也试试这个
String str = "1,,,,,2,3,,1,,3,,";
System.out.println(str);
char c[] = str.toCharArray();
int ptnCnt = 0;
for (char d : c) {
if(d==',')
ptnCnt++;
}
String result[] = new String[ptnCnt/4];
int i=-1;
int beginIndex = 0;
int cnt=0,loopcount=0;
for (char ele : c) {
loopcount++;
if(ele==',')
cnt++;
if(cnt==4){
cnt=0;
result[++i]=str.substring(beginIndex,loopcount);
beginIndex=loopcount;
}
}
for (String string : result) {
System.out.println(string);
}
这里有一个更灵活的函数,使用了 this answer 的想法:
static List<String> splitAtNthOccurrence(String input, int n, String delimiter) {
List<String> pieces = new ArrayList<>();
// *? is the reluctant quantifier
String regex = Strings.repeat(".*?" + delimiter, n);
Matcher matcher = Pattern.compile(regex).matcher(input);
int lastEndOfMatch = -1;
while (matcher.find()) {
pieces.add(matcher.group());
lastEndOfMatch = matcher.end();
}
if (lastEndOfMatch != -1) {
pieces.add(input.substring(lastEndOfMatch));
}
return pieces;
}
这就是您使用示例的调用方式:
String input = "1,,,,,2,3,,1,,3,,";
List<String> pieces = splitAtNthOccurrence(input, 4, ",");
pieces.forEach(System.out::println);
// Output:
// 1,,,,
// ,2,3,,
// 1,,3,,
我使用 Guava 中的 Strings.repeat
。
这项工作完美无缺,并在 Java 8
中进行了测试public String[] split(String input,int at){
String[] out = new String[2];
String p = String.format("((?:[^/]*/){%s}[^/]*)/(.*)",at);
Pattern pat = Pattern.compile(p);
Matcher matcher = pat.matcher(input);
if (matcher.matches()) {
out[0] = matcher.group(1);// left
out[1] = matcher.group(2);// right
}
return out;
}
//Ex: D:/folder1/folder2/folder3/file1.txt
//if at = 2, group(1) = D:/folder1/folder2 and group(2) = folder3/file1.txt