2014-04-13 2 views
1

을 분할 :자바 문자열 :이 문자열이 문자열

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

당신은 정규식 또는 사용하여 분할을 사용할 수 있습니다 중 하나 ","다음 –

+1

정규 표현식에 공상하지만, 그래서 당신이 문서하게 비밀로 판명 수 있습니다 다시 함께 배열을 넣어 무엇을 그것이 무엇인지 알아내는 것이 고통 스럽기 때문에, 특히 당신이나 누군가 다른 사람이 잠시 후에 코드를 본다면 그렇습니다. 또한, (복잡한) 정규 표현식은 @BrendanRius와 같이 다시 분할하거나 그룹화하는 것보다 더 많은 시간이 걸릴 것입니다. –

답변

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하지만 여전히 정규식을 사용하고 싶다면 패턴 및 매처 클래스를 사용하여 find 부분이 될 수있는 간단한 정규식을 만드는 것이 좋습니다. 흥미있는, 당신이 제거하고 싶은 부분을 찾을 수있는 복잡한 정규 표현식이 아닙니다. x는 그들이 문자열의 끝에 배치하는 경우 (점 1에서 정규 표현식에 의해 타의 추종을 불허하는 데이터의 나머지를 잡기 위해 어떤 xx 또는 xx,xx 또는 xxx,xxx,xxx 부품 ,
  • 아닌 어디

    1. 어떤 xx,xxx,xxx,xxx 부분 같은 것을 의미한다.)

    그래서

    Pattern p = Pattern.compile("[^,]+(,[^,]+){3}|[^,]+(,[^,]+){0,2}$"); 
    

    트릭을 할해야합니다.


    또 다른 해결책 아마 빠른 (쓰기 아주 쉽게), 당신의 문자열에서 모든 문자를 반복 일부 버퍼에 저장됩니다 자신의 파서를 만드는 것, 계산 방법 , 많은 이미 발생했으며 숫자가 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; 
    } 
    

    나중에 목록을 배열로 변환 할 수 있지만 나중에 목록으로 유지할 수 있습니다.

  • 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 
    
    +0

    또한 'w'는 단어 문자입니다. 또한 다른 문자가 있습니다. –

    +0

    @SotiriosDelimanolis> 예, 방공호가 제공 한 예를 통해 답변을 드리겠습니다. 지금 제 답변을 업데이트하겠습니다. – mok

    +0

    예상대로 작동하지 않습니다. – Braj

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

    간단하게 유지하십시오. regex을 사용할 필요가 없습니다. 쉼표의 수를 계산하십시오. 4 개의 쉼표가있는 경우 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