以下の形式の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のエスケープ方式)