正则表达式,替换双引号之间的所有逗号

时间:2009-11-01 22:09:39

标签: java regex

我有这个字符串:

1001,"Fitzsimmons, Des Marteau, Beale and Nunn",109,"George","COD","Standard",,109,8/14/1998 8:50:02

我将使用什么正则表达式来替换中的逗号 管道为"Fitzsimmons, Des Marteau, Beale and Nunn"的{​​{1}}所以它是:

|

应该澄清一下,我正在使用逗号对此字符串进行拆分,因此我希望"Fitzsimmons| Des Marteau| Beale and Nunn" 为字符串。我计划在拆分后用逗号替换"Fitzsimmons, Des Marteau, Beale and Nunn"

6 个答案:

答案 0 :(得分:4)

虽然可以使用正则表达式,但首先将行拆分为字段然后进行替换将更加清晰。有一个很好的(免费)java库可用于解析名为opencsv的的CSV文件。

答案 1 :(得分:4)

我曾尝试使用StringTokenizer,但效果不佳,所以这里的代码似乎可以满足您的需求:

import java.util.*;

public class JTest
{
    public static void main(String[] args)
    {
    String str = "1001,\"Fitzsimmons, Des Marteau, Beale and Nunn\",109,\"George\",\"COD\",\"Standard\",,109,8/14/1998 8:50:02";
    String copy = new String();

    boolean inQuotes = false;

    for(int i=0; i<str.length(); ++i)
        {
        if (str.charAt(i)=='"')
            inQuotes = !inQuotes;
        if (str.charAt(i)==',' && inQuotes)
            copy += '|';
        else
            copy += str.charAt(i);
        }

    System.out.println(str);
    System.out.println(copy);
    }
}

答案 2 :(得分:3)

嘿布兰登你可以通过使用后面的外观和前瞻轻松地做到这一点。见下面的代码

String cvsString = "1001,\"Fitzsimmons, Des Marteau, Beale and Nunn\",109,\"George\",\"COD\",\"Standard\",,109,8/14/1998 8:50:02";  
String rePattern = "(?<=\")([^\"]+?),([^\"]+?)(?=\")";  
// first replace  
String oldString = cvsString;  
String resultString = cvsString.replaceAll(rePattern, "$1|$2");  
// additional repalces until until no more changes  
while (!resultString.equalsIgnoreCase(oldString)){  
    oldString = resultString;  
    resultString = resultString.replaceAll(rePattern, "$1|$2");  
}  

结果字符串为 1001,"Fitzsimmons| Des Marteau| Beale and Nunn",109,"George","COD","Standard",,109,8/14/1998 8:50:02

NingZhang.info

答案 3 :(得分:2)

这里有一些似乎可以解决问题的Python:

>>> import re
>>> p = re.compile('["][^"]*["]|[^,]*')
>>> x = """1001,"Fitzsimmons, Des Marteau, Beale and Nunn",109,"George","COD","Standard",,109,8/14/1998 8:50:02"""
>>> y = p.findall(x)
>>> ','.join(z.replace(',','|') for z in y if z)
'1001,"Fitzsimmons| Des Marteau| Beale and Nunn",109,"George","COD","Standard",109,8/14/1998 8:50:02'

似乎这段代码变成了代码高尔夫问题: - )

哎呀......错过了Java标签。

答案 4 :(得分:1)

我相信这对正则表达式来说很难。问题是正则表达式必须计算引号以确定它是否在两个引号内。

实际上,.NET正则表达式引擎可以使用其balanced matching功能来实现。但我不认为Java有这个功能,如果没有它,我想不出可行的方法。

您可能必须编写一些程序代码才能完成此任务。

答案 5 :(得分:1)

嗯,这是一个CSV文件,所以我使用Ruby的内置CSV库。然后,您不必弄清楚如何处理转义的引号,例如。

require 'csv'
string =<<CSV
1001,"Fitzsimmons, Des Marteau, Beale and Nunn",109,"George","COD","Standard",,109,8/14/1998 8:50:02
CSV
csv=CSV.parse string
csv.each{|row| row.each {|cell| cell.gsub!(",","|") if cell.is_a?(String)}}
outstring = ""
CSV::Writer.generate(outstring){|out| csv.each {|row| out<<row}}