4

数年前に自分で書いた古いコードに出くわしました。しかし、今のところ、なぜそれが機能するのかわかりません。コードの変更に進む前に、なぜそれが機能するのかを理解する必要があります。

CSV形式のデータがあります

"abc",123456789,"def"

時々、サーバーが私を返します

"abc",123,456,789,"def"

そこで、解決するために次のコードを書きました。

public class Sandbox {

    private static final Pattern digitPattern = Pattern.compile("(\",)|,(?=[\\d,]+,\")");
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // "abc",123,456,789,"def"
        String data = "\"abc\",123,456,789,\"def\"";

        final String result = digitPattern.matcher(data).replaceAll("$1");

        // "abc",123456789,"def"
        System.out.println(result);
    }
}

ただし、コードを振り返ってみると、その理由がわから|,[\\d,]+、コンマを削除するのに役立ちます。入力のどの部分が|,一致していますか?

解析作業がどのように行われるかについての段階的な説明は非常に高く評価されています

4

1 に答える 1

2

交換しています

(\",)|,(?=[\\d,]+,\")

$1

つまり、二重引用符の直後のコンマはそのままにして(つまり、(\",)に取り込まれます$1)、1 つ以上の数字とコンマ、コンマ、および二重引用符(先読み) が後に続くコンマを削除します。主張、(?=[\\d,]+,\"))。交互 ( |) の場合、左から右の優先順位になるため、前半が一致した場合、つまりコンマが二重引用符の直後に続く場合、それで終わりです。そのため、エンジンは次のコンマを探して先に進みます。後半が一致した場合$1はキャプチャされないため、効果的に一致 (コンマ) を空の文字列に置き換えています。

于 2013-03-28T21:17:51.100 に答える