2

現在、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 セパレータとして使用されるコンマを保持します。

$1Android は一致しないグループに対して "" の代わりに "null" を使用するため、を使用しないようにしてください。

4

2 に答える 2

2

説明

文字列の途中でスタックしているすべてのコンマを置き換えるには、次のように使用します。空のキャプチャ グループ(\b)は、後方参照$#が一致しない場合に言語が null 文字を挿入するというAndroid の問題を回避する必要があります。

正規表現:((?:",\d|\d,")|",")|(\b),

と置換する:$1

ここに画像の説明を入力

入力

",123,456," 
","abc,def","
","123,456"," 
","abcdef,","

出力

",123456," 
","abcdef","
","123456"," 
","abcdef","

免責事項

これは、保持したいコンマがすべて引用符で囲まれていることを前提としています"alpha","beta","1234"

于 2013-06-14T03:16:52.313 に答える
0

また、文字列で , の 2 番目の発生を見つけて、それを "" に置き換えることもできます。ここにいくつかの例があります:

于 2013-06-14T04:05:39.000 に答える