Java字符串:拆分字符串

时间:2014-04-13 15:26:43

标签: java string

我有这个字符串:

 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";

4 个答案:

答案 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你感兴趣的部分在,没有复杂的正则表达式找到你想要摆脱的部分。我的意思是

  1. 其中x不是xx,xxx,xxx,xxx
  2. 的任何,部分
  3. 任何xxxx,xxxxx,xxx,xxx部分(如果它们位于字符串的末尾)(以捕获正则表达式从第1点无法匹配的其余数据。)
  4. 所以

    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() + ",";
}