正则表达式/ Java匹配缺少第二个引号的字段

时间:2018-01-16 14:57:20

标签: java regex etl

我在几个文本文件中有一个管道分隔记录,我将其加载到数据库中。事实证明,有时一个字段将以引号开头但不会以一个字符结尾,这会导致加载失败。这是一个示例记录

||field2|"field3"|"field4|"field5"|||

请注意,字段4缺少尾随引号。我想预处理文件并删除这些字段的引号,但我似乎无法想出一个有效的正则表达式

我尝试过前瞻和回顾组合,但始终与|"field3"|"field4|匹配,而不仅仅是|"field4|

我需要查找|"的内容和一些没有管道的文本,以没有引号的管道结尾。

4 个答案:

答案 0 :(得分:1)

此正则表达式会在之前找到所有|而不是"

(?<!")\|

所以你使用它:

String result = data.replaceAll("(?<!\")\\|", "\"|");

在此代码之后,您将在不使用管道的情况下将所有|替换为"|

答案 1 :(得分:1)

关注正则表达式

(?<=\|)"(?=[^|]*(?<!")\|)

匹配",其下一个|字符前面没有|

regex101

答案 2 :(得分:1)

您可以在正则表达式中使用否定类:

str = str.replaceAll("\\|\"([^|]*[^\"|]\\|)", "$1");

RegEx Demo

RegEx说明:

  • ":匹配双引号
  • |:匹配竖线字符
  • ([^"|]*[^"|]\|):后跟0个或更多不是管道的字符,后跟非管道,非引号字符后跟管道。同样在第1组

  • 中捕捉到这一点
  • 在替代时,只需使用$1使用捕获的组#1的反向引用来获取字段值而不使用双引号。

答案 3 :(得分:1)

代码

See regex in use here

("[^|"]*")|"([^|"]*\|)

替换:$1$2

结果

输入

|||"field3"|"field4|"field5"|||

输出

|||"field3"|field4|"field5"|||

说明

  • 匹配以下任一项
    • ("[^|"]*")将以下内容捕获到捕获组1中
      • "按字面意思匹配
      • [^|"]*任意次数匹配集|"中的字符以外的任何字符
      • "按字面意思匹配
    • "([^|"]*\|)
      • "按字面意思匹配
      • ([^|"]*\|)将以下内容捕获到捕获组2中
        • [^|"]*任意次数匹配集|"中的字符以外的任何字符
        • \|按字面意思匹配|