我几年前遇到了自己写的旧代码。但是,现在,我不知道它为什么会起作用。在进行代码更改之前,我需要了解它的工作原理。
我有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,]+
能够帮我删除逗号。输入的哪一部分|,
与?
逐步解释如何非常感谢解析工作
答案 0 :(得分:2)
您正在替换
(\",)|,(?=[\\d,]+,\")
与
$1
换句话说,你仅在双引号之后立即留下任何逗号(这是(\",)
,被捕获到$1
),但删除逗号后跟一个或多个数字和逗号,一个逗号和一个双引号(这是前瞻性断言,(?=[\\d,]+,\")
)。随着交替(|
),它是从左到右的优先级,所以如果前半部分匹配,即逗号紧跟双引号,那就是那个,所以引擎继续前进,寻找下一个逗号。如果匹配后半部分,则不会捕获$1
,因此您实际上是用空字符串替换匹配(逗号)。