我在几个文本文件中有一个管道分隔记录,我将其加载到数据库中。事实证明,有时一个字段将以引号开头但不会以一个字符结尾,这会导致加载失败。这是一个示例记录
||field2|"field3"|"field4|"field5"|||
请注意,字段4缺少尾随引号。我想预处理文件并删除这些字段的引号,但我似乎无法想出一个有效的正则表达式
我尝试过前瞻和回顾组合,但始终与|"field3"|"field4|
匹配,而不仅仅是|"field4|
我需要查找|"
的内容和一些没有管道的文本,以没有引号的管道结尾。
答案 0 :(得分:1)
此正则表达式会在之前找到所有|
而不是"
:
(?<!")\|
所以你使用它:
String result = data.replaceAll("(?<!\")\\|", "\"|");
在此代码之后,您将在不使用管道的情况下将所有|
替换为"|
答案 1 :(得分:1)
答案 2 :(得分:1)
您可以在正则表达式中使用否定类:
str = str.replaceAll("\\|\"([^|]*[^\"|]\\|)", "$1");
RegEx说明:
"
:匹配双引号|
:匹配竖线字符 ([^"|]*[^"|]\|)
:后跟0个或更多不是管道的字符,后跟非管道,非引号字符后跟管道。同样在第1组
在替代时,只需使用$1
使用捕获的组#1的反向引用来获取字段值而不使用双引号。
答案 3 :(得分:1)
("[^|"]*")|"([^|"]*\|)
替换:$1$2
|||"field3"|"field4|"field5"|||
|||"field3"|field4|"field5"|||
("[^|"]*")
将以下内容捕获到捕获组1中
"
按字面意思匹配[^|"]*
任意次数匹配集|"
中的字符以外的任何字符"
按字面意思匹配"([^|"]*\|)
"
按字面意思匹配([^|"]*\|)
将以下内容捕获到捕获组2中
[^|"]*
任意次数匹配集|"
中的字符以外的任何字符\|
按字面意思匹配|