2016-09-24 3 views
1

내가 (를 CSV 파일에서 가져온) 문자열을 반환자바 정규식은 예기치 않은 결과가 자바에서

40;"blue-collar";"married";"secondary";"no";1100;"yes";"no";"unknown";29;"may";660 

내 클래스 CSV_Worker 주어진 구분자 (;)하여 분할하고 필요한 경우 인용 부호를 제거합니다

public class CSV_Worker { 

    Pattern pattern = null; 
    int colCount = -1; 

    public CSV_Worker (String delimiter, int colCount) { 
    // (?<=^|;)(?:"([^;]*)"|([^;]*))(?=;|$) 
    this.pattern = Pattern.compile("(?<=^|\\" + delimiter + ")(?:\"([^\\" + delimiter + "]*)\"|([^\\" + delimiter + "]*))(?=\\" + delimiter + "|$)"); 
    this.colCount = colCount; 
    } 

    public String [] split (String line) { 

    String [] result = new String[this.colCount]; 
    Matcher m = pattern.matcher(line); 
    int idx = 0; 
    while (m.find()) { 
     result[idx] = m.group(); 
     idx++; 
    } 
    return result; 
    } 
} 

CSV_Worker.split(myString) 반환

40 
"blue-collar" 
"married" 
... 
,369 않습니다

대신

40 
blue-collar 
married 
... 

?

편집 솔루션이 다른 정규 표현식했다 @Fabian하는

감사 : m.group()

(?<=^|\|)"?((?<!")[^\|]*(?!")|(?<=")[^"]*(?="))"?(?=\||$) 

enter image description here

Debuggex Demo

+0

'String [] result = line.replaceAll ("^ \"$ "," ") .split ("\ "?;" "?");'시도하십시오. – saka1029

+0

기본적으로 좋은 생각이지만 따옴표는 서로 독립적이지 않습니다. 문자열에는 선행/후행 인용 부호가있는 요소 만 포함될 수 있습니다. 이는 결과에 남아 있어야합니다. – Benvorth

+2

정규식을 사용하여 CSV 데이터를 구문 분석하지 마십시오. CSV 파서를 사용하십시오. 그것이 그들이하는 일입니다. – Andreas

답변

2

는 전체 경기 수 (즉, 그룹 0) , 캡처 중 하나의 내용 만이 아닙니다. 여러 떼. 여기에는 비 캡처 그룹의 인용 부호가 포함됩니다. 또한 따옴표가있는 경우와 따옴표가없는 경우에는 다른 캡처 그룹을 사용합니다. 그러므로 당신은이 같은 Matcher 사용할 필요가 : 사용 lookarounds에 의해

String g1 = m.group(1); 
result[idx] = (g1 == null ? m.group(2) : g1); 

당신은 또한 단지 하나의 캡처 그룹을 사용할 수를

사용할 수 있습니다
Pattern pattern = Pattern.compile("(?<=^|\\" + delimiter + ")\"?((?<!\")[^\\" + delimiter + "]*(?!\")|(?<=\")[^\"]*(?=\"))\"?(?=\\" + delimiter + "|$)"); 

result[idx] = m.group(1); 
대신 split 메소드의

+0

스마트, 고맙습니다. 더 빠르기 때문에 제 2의 솔루션을 사용했습니다. – Benvorth

+0

btw : 긍정적 인 lookaround (또는의 두 번째 부분)가'(? <= \ ") [^"] * (? = \ ")'로 대체되면 솔루션이 완벽 해집니다. ; "afw; e22"; ... ' – Benvorth

관련 문제