4

可能重复:
在 Java 中使用 RegEx 解析 CSV 输入

我有一个输入文件,其中每一行都有以下形式的字符串输入值:

   "  ab  cd  " ,    "  efgh,ijk.",  4,"lmno"

IE,

  1. 这些词要么用引号引起来,要么没有引号。
  2. 开始词和结束词前后的空格是不允许的。

编辑:3.它可以有输入只是用逗号分隔。(abc,"Hi Mary,Joe",5

在java中使用.Split(),我需要一个正则表达式来输出这个:

ab  cd
efgh,ijk.
4
lmno

我试过这个:

[^",]*[\",]

但这不起作用"efgh,ijk."

这是正则表达式测试的链接:http ://regexpal.com/ 我需要一些帮助。请帮忙。谢谢

4

4 回答 4

2

演示

正则表达式模式:(?:\s*(?:\"([^\"]*)\"|([^,]+))\s*,?)+?

空值更新:(?:\s*(?:\"([^\"]*)\"|([^,]+))\s*,?|(?<=,)(),?)+? DEMO

它工作的一个例子,我知道它有点 CSV 格式,但只要你不写真的很奇怪的东西,它就会匹配所有的东西。

Matcher ma = Pattern.compile("(?:\\s*(?:\\\"([^\\\"]*)\\\"|([^,]+))\\s*,?)+?").matcher("   \"  ab  cd  \" ,    \"  efgh,ijk.\",  4,\"lmno\"");
while (ma.find()) {
    if (ma.group(1) == null) {
        System.out.println(ma.group(2));
    } else {
        System.out.println(ma.group(1));
    }
}

编辑,顺便说一句,如果您希望我们为您提供代码,请不要告诉我们有关正则表达式在线测试器的信息,如果您这样做是因为您知道如何处理正则表达式,如果您不知道该怎么做,请问它也。

于 2012-11-06T21:25:43.933 回答
2

我建议找到匹配项,然后对其进行修剪以获得最终结果。

Matcher m = Pattern.compile("\\s*(?:\"[^\"]*\"|(?:^|(?<=,))[^,]*)").matcher(s);
while (m.find()) {
  System.out.println(m.group().replaceAll("^\\s*\"?\\s*(.*?)\\s*\"?\\s*$", "$1"));
}

请参阅此演示

于 2012-11-06T22:28:31.827 回答
1

尝试split()使用(?:^\s*"\s*|\s*"\s*$|\s*"?\s*,\s*"?\s*)( demo ) 调用。

这也将匹配一个字符串中包含的逗号,这在您的情况下是错误的。但是,如果您要使用split(). 您可以引入某种方式来转义包含的逗号(如\,),这可以很容易地添加到正则表达式中。

否则,您将不得不使用其他一些方法来分解字符串,并且split()对您没有帮助。

于 2012-11-06T21:37:19.287 回答
0

如果您不想使用正则表达式,因为正则表达式暗示它是“常规”表达式。“我认为这里有一个模式”不是正则表达式。它们很好,速度很快,而且我只在我完全控制输入正则表达式时才使用它们。

//no development environment up, there may be compilation errors.
private static String[] csv(final String input){
  String[] inputArray = input.split(",");
  for(int i =0;i < inputArray.length;i++){
//org.apache.commons.lang.StringUtils
    String value = StringUtils.removeEnd(inputArray[i],"\"");
    value = StringUtils.removeStart(value,"\"");
    value = StringUtils.trim(value);

    inputArray[i] = value;
  }
  return inputArray;
}
于 2012-11-06T21:38:24.427 回答