以下の形式のCSVのデータ部分を全て検索する 文字列データの中に、 カンマも、文字としてのダブルコーテーションもない場合は、 文字列データがダブルコーテーションでくくってないこともある ダブルコーテーションでくくったデータの中での、 連続したダブルコーテーションは、文字としてのダブルコーテーションとします(VBのエスケープ方式) 不正なCSVの形式は考慮しない 検索前検索後
![]()
1,2,3,4,5,6,7,8,9 1,2,3,4,5,"6","7" 1,2,"abcd,efg","a,bc","dd"""",""ee" "aaa,aa""c,cc",1,2,3 4,5,6,""","",""ab,""c,d""e,f" """vvv" ","",dddd""""""gg""" 555,"""""4444""",12345 555,"""""4444""",12345,"""""444""111"
((?<=,(?=(([^"]*"){2})*[^"]*$))|^)([^",]+|"([^"]|"")+")
別解
((?<=,)(?=(([^"]*"){2})*[^"]*$)|^)([^",]+|"([^"]|"")+")
肯定戻り読みと、肯定先読みを組み合わせて、
ダブルコーテーションが偶数個あれば、
データ区切りのカンマと判断し、
ダブルコーテーションから開始した場合と、そうでない場合で、
場合分けしてます
この3つの正規表現の考え方の組み合わせといえるでしょう
4-16 文字列データを検索(VBのエスケープ方式)
4-18 文字列データのカンマを検索(VBのエスケープ方式)
4-26 HTMLのタグ内部を検索
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
単純にCSVのデータ部分にマッチさせるだけなら
(?!,(?=(([^"]*"){2})*[^"]*$)).
でもいいのですが
((?<=,)(?=(([^"]*"){2})*[^"]*$)|^)([^",]+|"([^"]|"")+")
でデータ部分ごとに、まとめてマッチさせることにより、
Javaや.NETなどの、
CSVを読み込む処理で、プログラムの行数を減らすことができます。
(CSVのデータ部分にマッチする正規表現を記述し、マッチを進めるだけでよくなります)
@IT:Java TIPS -- Javaで正規表現を活用する(java.util.regexパッケージ)
@IT:.NET Frameworkがサポートする正規表現クラスを徹底活用する
正規表現の処理系によっては、
((?!,(?=(([^"]*"){2})*[^"]*$)).)+
や
[^",]+|"([^"]|"")+"
でも、データ部分ごとに、まとめてマッチするかもしれませんね
Javaや.NETで、CSVのデータ部分を読み取るなら、
splitメソッドを使う方法もあります。
4-18 文字列データのカンマを検索(VBのエスケープ方式)