正则表达式用于在引号括起时删除字符串中的逗号
我只需要用引号括起来删除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(); }