繁体   English   中英

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

[英]Regular expression, replace all commas between double quotes

我有这个字符串:

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

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

"Fitzsimmons| Des Marteau| Beale and Nunn"

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

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

我尝试使用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);
    }
}

嗨,布兰登,您可以使用后视和前瞻轻松地通过RE做到这一点。 见下面的代码

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

宁张网

以下是一些似乎可以解决问题的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标签。

我相信使用正则表达式很难做到这一点。 问题在于正则表达式必须对引号进行计数,以确定它是否在两个引号内。

实际上,.NET正则表达式引擎可以通过其平衡匹配功能来做到这一点。 但是我不认为Java具有该功能,没有它我就无法想到一种可靠的方法。

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

好吧,这是一个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}}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM