入力が適切な形式である (不均衡な引用符がない) ことを確認できる場合、これは機能します (適切な形式でない場合は、どうしたいですか?):
"(([^"]*?)((""[^"]*?)*?))"(?!")
これは、引用符の後に引用符以外のものが 0 回以上続き、任意の数の二重引用符のペアとそれに続く任意の数の非引用符で構成されるグループが続き、引用符が続かない引用符で終わります。
各データが a で終わることが確実な場合";
は、少し簡単になります
"(([^"]*?)((""[^"]*?)*?))";
しかし、行の最後のものは";
引用符で終わっていますか?
JoelFan と OldCurmudgeon からインスピレーションを得て、これは機能し、少し単純になりました。
"((?:[^"]|"")*)"
各パターンで、データはキャプチャ グループ 1 にあります。したがって、コードは次のようになります。
while (matcher.find()) {
data = matcher.group(1);
/* do whatever you want with the data such as replace '""' with '"' */
}
もちろん、パターンを Java 文字列として記述する場合は、パターン内の引用符をエスケープする必要があるため、コードでは次のようになります。
"\"(([^\"]*?)((\"\"[^\"]*?)*?))\"(?!\")"
また
"\"(([^\"]*?)((\"\"[^\"]*?)*?))\";"
または(コードで使用するもの)
"\"((?:[^\"]|\"\")*)\""