現在、CSV 行の文字列からコンマを削除する傾向があります。
ここに私の期待があります
// (1) ",123,456," -> ",123456,"
// (2) ","abc,def"," -> ","abcdef","
// (3) ","123,456"," -> ","123456","
// (4) ","abcdef,"," -> ","abcdef","
次のコードを書きました
String[] test = {
"\",123,456,\"",
"\",\"abc,def\",\"",
"\",\"123,456\",\"",
"\",\"abcdef,\",\""
};
final Pattern commaNotBetweenQuotes = Pattern.compile("(?<!\"),(?!\")");
for (String d : test) {
System.out.println("O : " + d);
String result = commaNotBetweenQuotes.matcher(d).replaceAll("");
System.out.println("R : " + result);
}
ただし、(4)の場合は失敗します
ここに私が得る出力があります
O : ",123,456,"
R : ",123456,"
O : ","abc,def","
R : ","abcdef","
O : ","123,456","
R : ","123456","
O : ","abcdef,","
R : ","abcdef,"," <-- we expect the comma after "f" being remove, as
it is inside string quote
この正規表現パターンをさらに改善する方法を教えてください。
final Pattern commaNotBetweenQuotes = Pattern.compile("(?<!\"),(?!\")");
Java SE と Android プラットフォームで異なる正規表現の結果からコードを取得します
パターンについて私が理解していることは、
コンマの左側と右側に二重引用符がない場合は、空の文字列に置き換えます。
使ってみます
final Pattern commaNotBetweenQuotes = Pattern.compile("(?<!\"),(?!\")|(?<![\"0-9]),(?=\")");
アイデアを持って
コンマの左側と右側に二重引用符がない場合は、空の文字列に置き換えます。
また
コンマの右側に二重引用符があり、左側に非数字/非二重引用符がある場合は、空の文字列に置き換えます。
ただし、「ソリューション」はエレガントではありません。私が本当に欲しいのは、文字列リテラル内のコンマを削除することです。整数内のコンマを削除します。CSV セパレータとして使用されるコンマを保持します。
$1
Android は一致しないグループに対して "" の代わりに "null" を使用するため、を使用しないようにしてください。