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

4-18 文字列データのカンマを検索(VBのエスケープ方式)

正規表現パズル

CSVデータの、文字列データのカンマを検索する。

文字列データは、ダブルコーテーションでくくったデータですが、
連続したダブルコーテーションは、文字としてのダブルコーテーションとします(VBのエスケープ方式)

検索前


検索後


対象データ

1,2,3,"abcd,efg","a,bc","dd"""",""ee"
"aaa,aa""c,cc",1,2,3
4,5,6,""","",""ab,""c,d""e,f"


正規表現

,(?!(([^"]*"){2})*[^"]*$)


解説

行末までのダブルコーテーションの数は、偶数か奇数なので
行末までのダブルコーテーションの数が偶数でなければ、
行末までのダブルコーテーションの数が奇数なので、
文字列データのカンマだと判断してます。

行末までのダブルコーテーションの数が偶数であることは、
行末までのダブルコーテーションの数が奇数であることの
余事象であると考えてもいいでしょう。

事象と集合

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
なお、文字列データでないカンマは
,(?=(([^"]*"){2})*[^"]*$)
となりますので、

JavaでCSVを読み込む処理を記述する際には、
String[] csv = (CSVのデータ).split(文字列データでないカンマ)
といった記述が使えます。
String.splitメソッド

VB.NETでCSVを読み込む処理を記述する際には、
Dim csv as String() = Regex.Split(CSVのデータ,文字列データでないカンマ,RegexOptions.ExplicitCapture)
といった記述が使えます。
Regex.Splitメソッド

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
ちなみに、正規表現を使う必要がない場合は、split関数で十分です。
@IT:.NET TIPS 文字列を文字列により分割するには?(VB.NET関数活用) - C#