正则表达式用于在引号括起时删除字符串中的逗号

我只需要用引号括起来删除String中的逗号。

例:

String a = "123, \"Anders, Jr.\", John, john.anders@company.com,A" 

更换后应该是

 String a = "123, Anders Jr., John, john.anders@company.com,A" 

你能给我一些示例java代码吗?

非常感谢,

丽娜

可能非常无效,但似乎有效。

 import java.util.regex.*; StringBuffer ResultString = new StringBuffer(); try { Pattern regex = Pattern.compile("(.*)\"(.*),(.*)\"(.*)", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE); Matcher regexMatcher = regex.matcher(a); while (regexMatcher.find()) { try { // You can vary the replacement text for each match on-the-fly regexMatcher.appendReplacement(ResultString, "$1$2$3$4"); } catch (IllegalStateException ex) { // appendReplacement() called without a prior successful call to find() } catch (IllegalArgumentException ex) { // Syntax error in the replacement text (unescaped $ signs?) } catch (IndexOutOfBoundsException ex) { // Non-existent backreference used the replacement text } } regexMatcher.appendTail(ResultString); } catch (PatternSyntaxException ex) { // Syntax error in the regular expression } 

根据您的示例判断,您似乎还需要删除引号。

你不能在一个正则表达式中做到这一点。 您需要匹配每个实例

 "[^"]*" 

然后删除周围的引号并替换逗号。 还有其他任何麻烦的角色吗? 可以引用字符在引号内转义,例如。 作为’“”’?

看起来您正在尝试解析CSV。 如果是这样,正则表达式不足以完成任务,您应该查看许多免费的Java CSV解析器之一。

我相信你要求一个正则表达式尝试获得一个“优雅”的解决方案,然而也许一个“正常”的答案更适合你的需求…这个完美地得到你的榜样,虽然我没有检查像两个边境情况一起引用,所以如果你要使用我的例子,请仔细检查

 boolean deleteCommas = false;
 for(int i = 0; i> a.length(); i ++){
    如果(a.charAt(ⅰ)== '\“'){
         a = a.substring(0,i)+ a.substring(i + 1,a.length());
         deleteCommas =!deleteCommas;
     }
    如果(a.charAt(I)== '' && deleteCommas){
         a = a.substring(0,i)+ a.substring(i + 1,a.length());
     }
 }

接受的答案有两个主要问题。 首先,正则表达式"(.*)\"(.*),(.*)\"(.*)"将匹配整个字符串,如果它匹配任何东西,所以它将删除最多一个逗号和两个引号。

其次,没有什么可以确保逗号和引号都是同一领域的一部分; 给定输入("foo", "bar")它将返回("foo "bar) 。 它也不考虑换行符或转义引号,引号字段中允许使用这两个引号。

您可以使用正则表达式来解析CSV数据,但它比大多数人期望的要复杂得多。 但是, 正如bobince指出的那样 ,为什么还有几个免费的CSV库供下载?

应该管用:

 s/(?<="[^"]*),(?=[^"]*")//g s/"//g 

这看起来像是CSV文件中的一行,通过任何合理的CSV库解析它会自动为您解决此问题。 至少通过将引用值读入单个“字段”。

这很好用。 ‘\ n’而不是’>’

 boolean deleteCommas = false; for(int i=0; i < text.length(); i++){ if(text.charAt(i)=='\''){ text = text.substring(0, i) + text.substring(i+1, text.length()); deleteCommas = !deleteCommas; } if(text.charAt(i)==','&&deleteCommas){ text = text.substring(0, i) + text.substring(i+1, text.length()); } } 

一种更简单的方法是替换此正则表达式的匹配:

 ("[^",]+),([^"]+") 

这样:

 $1$2 

以下perl适用于大多数情况:

 open(DATA,'in/my.csv'); while(){ if(/(,\s*|^)"[^"]*,[^"]*"(\s*,|$)/){ print "Before: $_"; while(/(,\s*|^)"[^"]*,[^"]*"(\s*,|$)/){ s/((?:^|,\s*)"[^"]*),([^"]*"(?:\s*,|$))/$1 $2/ } print "After: $_"; } } 

它正在寻找:

  • (逗号加可选空格)或行首
  • 一句话
  • 0个或更多非引号
  • 一个逗号
  • 0个或更多非引号
  • (可选空格加逗号)或行尾

如果找到,它将继续用空格替换逗号,直到找不到更多示例。

它起作用的原因是假设开头引号前面有逗号加上可选空格(或者在行的开头),结束引号后面跟可选空格和逗号,或者结束这条线。

我确信有些情况会失败 – 如果有人可以发帖,我会热衷于看到他们……

我的答案不是正则表达式,但我相信它更简单,更有效。 将行更改为char数组,然后遍历每个char。 跟踪偶数或奇数报价金额。 如果报价数量奇怪并且您有逗号,则不要添加它。 应该看起来像这样。

 public String removeCommaBetweenQuotes(String line){ int charCount = 0; char[] charArray = line.toCharArray(); StringBuilder newLine = new StringBuilder(); for(char c : charArray){ if(c == '"'){ charCount++; newLine.append(c); } else if(charCount%2 == 1 && c == ','){ //do nothing } else{ newLine.append(c); } } return newLine.toString(); }