我有这个字符串:
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"
。
答案 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}}