用于在Java中读取CSV的正则表达式

时间:2012-11-06 21:15:27

标签: java regex split token

  

可能重复:
  Parsing CSV input with a RegEx in java

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

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

即,

  1. 这些单词要么用引号,要么没有引号。
  2. 不允许分别在开始和结束字之前和之后的空格。
  3. 编辑:3。输入可以用逗号分隔。(abc,"Hi Mary,Joe",5

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

    ab  cd
    efgh,ijk.
    4
    lmno
    

    我试过了:

    [^",]*[\",]
    

    但这不适用于"efgh,ijk."

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

4 个答案:

答案 0 :(得分:2)

DEMO

正则表达式模式:(?:\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));
    }
}
编辑,顺便说一句,如果您希望我们为您提供代码,请不要告诉我们有关正则表达式的在线测试人员,如果您这样做,那是因为您知道如何处理正则表达式,如果您不知道该怎么做那个,也问一下。

答案 1 :(得分:2)

我建议找到匹配项,然后修剪它们以获得最终结果。

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

请参阅this demo

答案 2 :(得分:1)

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

这也将匹配一个String中包含的逗号,这在您的情况下是错误的。但如果您要使用split(),这是唯一的方法。您可以介绍一些转义包含逗号的方法(如\,),这可以很容易地添加到正则表达式中。

否则你将不得不使用其他一些方法来消除字符串,split()对你没用。

答案 3 :(得分:0)

如果您不想使用正则表达式,正则表达式意味着它是'regular' expression。 “我认为这里有一种模式”不是正则表达式。它们很好,它们很快,我只在完全控制输入到正则表达式的输入时使用它们。

//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;
}