几年前我偶然发现了自己编写的旧代码。但是,现在,我不知道它为什么有效。在我继续进行代码更改之前,我需要了解它的工作原理。
我有 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/