我收到以下字符串作为文件记录的一部分
1234567890|ABCDE|""|"01|02|03|"|453625|New Account|05736372828|NA|||AT|899
记录使用管道符号
|
作为分隔符,但是,如果 |
出现在双引号 "
内的数据中,则不应将其拆分并视为单个文本,例如"01|02|03"
我正在使用正则表达式尝试将
"01|02|03|"
数据转换为 "01,02,03,"
,然后使用 |
分隔符拆分字符串,但是正则表达式未按预期工作。
下面是使用另一个SO问题的参考为该要求编写的代码片段正则表达式,替换双引号之间的所有逗号
public static void main(String[] args) {
String orig = "1234567890|ABCDE|\"\"|\"01|02|03|\"|453625|New Account|05736372828|NA|||AT|899";
String regex = "(?<=\")([^\"]+?)\\|([^\"]+?)(?=\")";
String old = orig;
String result = orig.replaceAll(orig, "$1,$2");
while (!result.equalsIgnoreCase(old)){
old = result;
result = result.replaceAll(regex, "$1,$2");
}
System.out.println(result);
}
上述代码的输出是
1234567890|ABCDE|""|"01,02,03|"|453625|New Account|05736372828|NA|||AT|899
,这与预期不符。 |
中的 03
之后的 "01|02|03|"
不会被 ,
替换。
如果有人可以帮助纠正正则表达式或分享一个全新的正则表达式,这将有助于通过保留
|
中的 "
来分割字符串。
理想情况下,您应该在此处使用解析器,而不是正则表达式。话虽如此,您可以匹配以下交替:
(?<=").*?(?=")|[^|]+
假设双引号在 PSV 文件中始终保持正确平衡,这应该可以工作。
示例代码:
String input = "1234567890|ABCDE|""|"01|02|03|"|453625|New Account|05736372828|NA|||AT|899";
String pattern = "(?<=\").*?(?=\")|[^|]+";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(input);
while (m.find()) {
System.out.println(m.group());
}