旧正则表达式代码的解释说明

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,]+ 能帮助我去除逗号。输入的哪一部分与 |, 匹配呢?
非常感谢逐步解释解析过程。

如果你想删除所有前后都有数字的逗号,为什么不使用 data = data.replaceAll("(\\d),(\\d)", "$1$2"); 呢? - jlordo
| 表示或,就像匹配它前面的内容或后面的内容。 - Sotirios Delimanolis
1个回答

2

您正在替换

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

使用

$1

换句话说,你会保留紧接着双引号的逗号(即`(\",)`,被捕获到`$1`),但是会移除那些后面跟着1个或多个数字和逗号、一个逗号以及一个双引号的逗号(即前瞻断言,`(?=[\\d,]+,\")`)。在使用交替符(`|`)时,它遵循从左到右的优先级。如果匹配了前半部分,也就是逗号紧接着一个双引号,那么这个逗号就会被保留,引擎会继续寻找下一个逗号。如果匹配了后半部分,`$1`就不会被捕获,因此实际上你是用空字符串替换了匹配结果(即逗号)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接