java - 旧正则表达式代码的必要解释

标签 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,]+ 可以帮助我删除逗号。 |, 匹配输入的哪一部分?

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

最佳答案

你正在替换

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

$1

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

关于java - 旧正则表达式代码的必要解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15692125/

相关文章:

java - 使用属性设置枚举值

java - Spring MVC - 基本RequestMapping问题

java - 安卓.view.WindowManager$BadTokenException : Unable to add window — token null is not valid

正则表达式子匹配替换

c# - 如何在正则表达式中留出空间?

regex - 如何从 php 数组中获取值

python - 在 Python Pandas 的数据帧上使用字符串方法?

java - 撤销ActiveMQ消息

php - 使用 php,如何将 [0-9]、[0-9] 替换为 [0-9][0-9]?

java - Angular2 HttpClient 使用 Rest API