正则表达式替换双引号之间的所有管道符号

问题描述 投票:0回答:1

我收到以下字符串作为文件记录的一部分

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|"
不会被
,
替换。

如果有人可以帮助纠正正则表达式或分享一个全新的正则表达式,这将有助于通过保留

|
中的
"
来分割字符串。

java regex delimiter
1个回答
0
投票

理想情况下,您应该在此处使用解析器,而不是正则表达式。话虽如此,您可以匹配以下交替:

(?<=").*?(?=")|[^|]+

假设双引号在 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());
}
© www.soinside.com 2019 - 2024. All rights reserved.