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 回答