旧正则表达式代码的必要说明

时间:2013-03-28 21:04:27

标签: java regex

我几年前遇到了自己写的旧代码。但是,现在,我不知道它为什么会起作用。在进行代码更改之前,我需要了解它的工作原理。

我有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,]+能够帮我删除逗号。输入的哪一部分|,与?

匹配

逐步解释如何非常感谢解析工作

1 个答案:

答案 0 :(得分:2)

您正在替换

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

$1

换句话说,你仅在双引号之后立即留下任何逗号(这是(\",),被捕获到$1),但删除逗号后跟一个或多个数字和逗号,一个逗号和一个双引号(这是前瞻性断言,(?=[\\d,]+,\"))。随着交替(|),它是从左到右的优先级,所以如果前半部分匹配,逗号紧跟双引号,那就是那个,所以引擎继续前进,寻找下一个逗号。如果匹配后半部分,则不会捕获$1,因此您实际上是用空字符串替换匹配(逗号)。