2016-09-24 8 views
1

を返す私は(CSVファイルから取られた)文字列を持っている:のJava正規表現は、Javaで予期しない結果

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

の代わりに

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) 、キャプチャの1つの内容だけではなくグループ。これには、キャプチャしていないグループの引用符も含まれます。さらに、引用符がある場合と引用符がない場合には、異なるキャプチャグループを使用します。あなたはまた、前後参照あなたが

result[idx] = m.group(1); 
を使用することができます

Pattern pattern = Pattern.compile("(?<=^|\\" + delimiter + ")\"?((?<!\")[^\\" + delimiter + "]*(?!\")|(?<=\")[^\"]*(?=\"))\"?(?=\\" + delimiter + "|$)"); 

を使用して1つだけのキャプチャグループを使用することができ

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

:そのため、このようMatcherを使用する必要があります代わりにsplitメソッドの

+0

スマート、ありがとう。私はそれが速いので、2番目のソリューションを使用しました。 – Benvorth

+0

btw:あなたの解決策は、あなたの解決策が完全なものになります(または2番目の部分または)が '(?<= \")[^ "] *(?= \") 'で置き換えられます。 ; "afw; e22"; ... ' – Benvorth