トップページに戻る    次の正規表現パズルへ    前の正規表現パズルへ

5-1 CSVのデータを検索(VBのエスケープ方式)

正規表現パズル

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