正規表現から始めることができます:
[^",]*|"[^"]*"
コンマを含まない引用符で囲まれていない文字列または引用符で囲まれた文字列のいずれかに一致します。ただし、次のような多くの質問があります。
入力のコンマの後に本当にスペースがありますか? または、より一般的には、正確にフィールドの最初の文字にない引用符を許可しますか?
引用符を含むフィールドをどのように引用符で囲みますか?
その質問にどのように答えるかによって、異なる正規表現になる可能性があります。(実際、CSV 解析ライブラリを使用するための慣習的なアドバイスは、コーナー ケースの処理に関するものではありません。ライブラリを解析しています。CSV はめちゃくちゃです。)
私が使用してある程度成功した正規表現の 1 つ (ただし、CSV 互換ではありません) は次のとおりです。
(?:[^",]|"[^"]*")*
これは最初のものと非常によく似ていますが、連結されたフィールドをいくつでも許可するため、次の両方がすべて単一のフィールドとして認識されます。
"John"", Mary"
John", "Mary
CSV 標準では、最初のものを次のものとして扱います。
John", Mary -- internal quote
2 番目の引用符を通常の文字として扱い、2 つのフィールドができます。だからYMMV。
いずれにせよ、適切な正規表現を決定すれば、アルゴリズムは単純です。私は Java の専門家ではないので、疑似コードで説明します。
repeat:
match the regex at the current position
and append the result to the result;
if the match fails:
report error
if the match goes to the end of the string:
done
if the next character is a ',':
advance the position by one
otherwise:
report error
正規表現によっては、エラーを報告する 2 つの条件が当てはまらない場合があります。一般に、引用されたフィールドが終了していない場合、最初のものはトリガーされます(そして、引用されたフィールドで改行を許可するかどうかを決定する必要があります-CSVはそうします)。私が提供した最初の正規表現を使用し、引用符で囲まれた文字列の直後にコンマを付けなかった場合、2 つ目の問題が発生する可能性があります。