我有这个字符串:
String string="NNP,PERSON,true,?,IN,O,false,pobj,NNP,ORGANIZATION,true,?,p";
如何每4个逗号分成一个数组? 我想要这样的东西:
String[] a=string.split("d{4}");
a[0]="NNP,PERSON,true,?";
a[1]="IN,O,false,pobj";
a[2]="NNP,ORGANIZATION,true,?";
a[3]="p";
答案 0 :(得分:2)
保持简单。无需使用regex
。只需计算逗号的数量即可。当找到四个逗号时,请使用String.substring()
找出该值。
最后将打印的值存储在ArrayList<String>
。
String string = "NNP,PERSON,true,?,IN,O,false,pobj,NNP,ORGANIZATION,true,?,p";
int count = 0;
int beginIndex = 0;
int endIndex = 0;
for (char ch : string.toCharArray()) {
if (ch == ',') {
count++;
}
if (count == 4) {
System.out.println(string.substring(beginIndex + 1, endIndex));
beginIndex = endIndex;
count = 0;
}
endIndex++;
}
if (beginIndex < endIndex) {
System.out.println(string.substring(beginIndex + 1, endIndex));
}
输出:
NP,PERSON,true,?
IN,O,false,pobj
NNP,ORGANIZATION,true,?
p
答案 1 :(得分:1)
如果你真的必须使用拆分,你可以使用像
这样的东西String[] array = string.split("(?<=\\G[^,]{1,100},[^,]{1,100},[^,]{1,100},[^,]{1,100}),");
解释是否对类似但更简单的主题提出了in my previous answer
演示:
String string = "NNP,PERSON,true,?,IN,O,false,pobj,NNP,ORGANIZATION,true,?,p";
String[] array = string.split("(?<=\\G[^,]{1,100},[^,]{1,100},[^,]{1,100},[^,]{1,100}),");
for (String s : array)
System.out.println(s);
输出:
NNP,PERSON,true,?
IN,O,false,pobj
NNP,ORGANIZATION,true,?
p
但是如果你有可能不必使用split,但你仍然想使用正则表达式,那么我鼓励你使用Pattern和Matcher类来创建简单的正则表达式,它可以find
你感兴趣的部分在,没有复杂的正则表达式找到你想要摆脱的部分。我的意思是
xx,xxx,xxx,xxx
,
部分
xx
或xx,xx
或xxx,xxx,xxx
部分(如果它们位于字符串的末尾)(以捕获正则表达式从第1点无法匹配的其余数据。)所以
Pattern p = Pattern.compile("[^,]+(,[^,]+){3}|[^,]+(,[^,]+){0,2}$");
应该这样做。
另一个解决方案,可能是 最快 (并且非常容易编写)将创建自己的解析器,它将迭代字符串中的所有字符,将它们存储在某些字符串中缓冲区,计算已经发生了多少,
,如果number是4清除缓冲区的乘法并将其竞争写入数组(或更好的动态集合,如列表)。这样的解析器看起来像
public static List<String> parse(String s){
List<String> tokens = new ArrayList<>();
StringBuilder sb = new StringBuilder();
int commaCounter = 0;
for (char ch: s.toCharArray()){
if (ch==',' && ++commaCounter == 4){
tokens.add(sb.toString());
sb.delete(0, sb.length());
commaCounter = 0;
}else{
sb.append(ch);
}
}
if (sb.length()>0)
tokens.add(sb.toString());
return tokens;
}
如果需要,您可以稍后将List转换为数组,但我会继续使用List。
答案 2 :(得分:0)
编辑, 试试这个:
String str = "NNP,PERSON,true,?,IN,O,false,pobj,NNP,ORGANIZATION,true,?,p";
String[] arr = str.split(",");
ArrayList<String> result = new ArrayList<String>();
String s = arr[0] + ",";
int len = arr.length - (arr.length /4) * 4;
int i;
for (i = 1; i <= arr.length-len; i++) {
if (i%4 == 0) {
result.add(s.substring(0, s.length()-1));
s = arr[i] + ",";
}
else
s += arr[i] + ",";
}
s = "";
while (i <= arr.length-1) {
s += arr[i] + ",";
i++;
}
s += arr[arr.length-1];
result.add(s);
输出:
NP,PERSON,true,?
IN,O,false,pobj
NNP,ORGANIZATION,true,?
p
答案 3 :(得分:0)
StringTokenizer tizer = new StringTokenizer (string,",");
int count = tizer.countTokens ()/4;
int overFlowCount = tizer.countTokens % 4;
String [] a;
if(overflowCount > 0)
a = new String[count +1];
else
a = new String[count];
int x = 0;
for (; x <count; x++){
a[x]= tizer.nextToken() + "," + tizer.nextToken() + "," + tizer.nextToken() + "," + tizer.nextToken();
}
if(overflowCount > 0)
while(tizer.hasMoreTokens()){
a[x+1] = a[x+1] + tizer.nextToken() + ",";
}