regex 使用正则表达式查找(Java版本)从csv中提取列,使用非捕获组

8iwquhpp  于 2023-04-07  发布在  Java
关注(0)|答案(2)|浏览(129)

试图解决一个简单的问题,但却难以理解如何正确地进行模式匹配。
我试过(?<=,).*?(?=,)
我的测试字符串是:"AAA","BBB","CCC","DDD","EE""E","FFF","GGGGG","HHHHHHHHHHHHHHHH"
我有一个非标准的引用csv文件,其中每列的双引号内可以有双引号。
因此,我需要使用正则表达式来使用非捕获组和查找来提取每一列,因为我不能使用捕获/匹配组
所以我需要一堆不同的表达式,只捕获以下结果:
“AAA”
“BBB”
“CCC”
“DDD”
“EE”“E”
“FFF”
等等
csv可能包含50个左右的列,上面的只是一个典型的例子

relj7zay

relj7zay1#

根据你所说的,所有的字段都是双引号的。看起来你应该匹配引号字符串,而不是关注逗号(字段中间可能会出现逗号)。
最简单的方法是找到所有的"(""|[^"]*)*",然后在后处理步骤中清除双引号。
看起来相当可怕的逃生的地方!

String input = "\"AAA\",\"BBB\",\"CCC\",\"DDD\",\"EE\"\"E\",\"FFF\",\"GGGGG\",\"HHHHHHHHHHHHHHHH\"";

   List<String> cleanMatches = new ArrayList<String>();
   Matcher m = Pattern.compile("\"((\"\"|[^\"]*)*)\"").matcher(input);

   while (m.find()) {
     // Replace the doubled double-quotes with single double-quotes.
     // group(1) does not include the enclosing quotes.

     cleanMatches.add(m.group(1).replace("\"\"", "\""));
   }

输出:

AAA
BBB
CCC
DDD
EE"E
FFF
GGGGG
HHHHHHHHHHHHHHHH
tez616oj

tez616oj2#

以下是使用split的解决方案:

String input = "\"AAA\",\"BBB\",\"CCC\",\"DDD\",\"EE\"\"E\",\"FFF\",\"GGGGG\",\"HHHHHHHHHHHHHHHH\"";

String[] columns = input.split("(?<=\"),(?=\")");
for(String column : columns){
    System.out.println(column);
}
System.out.println("------");
for(String column : columns){
    System.out.println(column.replaceAll("(?<!\")\"", ""));
}

预期输出:

"AAA"
"BBB"
"CCC"
"DDD"
"EE""E"
"FFF"
"GGGGG"
"HHHHHHHHHHHHHHHH"
------
AAA
BBB
CCC
DDD
EE"E
FFF
GGGGG
HHHHHHHHHHHHHHHH

在这里,(?<=\"),(?=\")查找引号包围的逗号,并使用它们进行分割。
你也可以看到如何剥离外引号和引号转义。
(?<!\")\"表示任何引号,前面没有另一个引号。

相关问题