例如,我有这个字符串参数:Blabla,1,Yooooooo,Stackoverflow,foo,chinese
我希望得到字符串testCaseParams
,直到第3个逗号:Blabla,1,Yooooooo
然后从原始字符串中删除它和逗号,以便我得到Stackoverflow,foo,chinese
我正在尝试此代码,但testCaseParams
仅显示前两个值(获取第二个逗号的索引,而不是第三个...)
//Get how many parameters this test case has and group the parameters
int amountOfInputs = 3;
int index = params.indexOf(',', params.indexOf(',') + amountOfInputs);
String testCaseParams = params.substring(0,index);
params = params.replace(testCaseParams + ",","");
答案 0 :(得分:1)
一个选项是聪明地使用String#split
:
String input = "Blabla,1,Yooooooo,Stackoverflow,foo,chinese";
String[] parts = input.split("(?=,)");
String output = parts[0] + parts[1] + parts[2];
System.out.println(output);
答案 1 :(得分:0)
您可以在变量中保存当前找到的逗号的索引并迭代直到找到第三个逗号:
int index = 0;
for (int i=0; i<3; i++) index = str.indexOf(',', index);
String left = str.substring(0, index);
String right = str.substring(index+1); // skip comma
编辑:要验证字符串,只需检查是否index == -1
。如果是这样,字符串中没有3个逗号。
答案 2 :(得分:0)
可以使用限制为4的分割。
String input = "Blabla,1,Yooooooo,Stackoverflow,foo,chinese";
String[] parts = input.split(",", 4);
if (parts.length == 4) {
String first = parts[0] + "," + parts[1] + "," + parts[2];
String second = parts[3]; // "Stackoverflow,foo,chinese"
}
答案 3 :(得分:0)
您可以使用此正则表达式进行拆分以获得2次拍摄:
String[] parts = input.split("(?<=\\G.*,.*,.*),");
这将导致parts
等于:
{ "Blabla,1,Yooooooo", "Stackoverflow,foo,chinese" }
\\G
指的是前一个匹配或字符串的开头
(?<=)
是positive look-behind。
所以它意味着匹配逗号进行拆分,如果前一个匹配或字符串的开头之后有2个其他逗号。
这将在逗号之间保留空字符串。
答案 4 :(得分:0)
我在这里提供的只是一个“有趣”的单行解决方案:
public static int nthIndexOf(String str, String c, int n) {
return str.length() - str.replace(c, "").length() < n ? -1 : n == 1 ? str.indexOf(c) : c.length() + str.indexOf(c) + nthIndexOf(str.substring(str.indexOf(c) + c.length()), c, n - 1);
}
//Usage
System.out.println(nthIndexOf("Blabla,1,Yooooooo,Stackoverflow,foo,chinese", ",", 3)); //17
(它当然是递归的,所以会炸大字符串,它相对较慢,当然不是在生产中这样做的明智方法。)
作为一个使用库的更敏感的单行,您可以使用Apache commons ordinalIndexOf(),它以更明智的方式实现同样的目标!