[英]How to replace all commas (,) in a String with a commas between double quotes (“,”)?
[英]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.