Regex/Java 匹配缺少第二个引号的字段

Regex/Java match fields with missing second quote

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

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

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

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

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

此正则表达式将查找所有 | 之前没有 " 的内容:

(?<!")\|

所以你用它:

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

在这段代码之后,您将把字符串替换为之前没有管道的所有 |"|

遵循正则表达式

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

匹配前面有文字 |" 并且下一个 | 字符前面没有 "

regex101

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

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

RegEx Demo

正则表达式解释:

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

  • 中也捕获这个
  • 在替换中,只需使用捕获组 #1 的反向引用,使用 获取不带前导双引号的字段值。

代码

See regex in use here

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

替换:</code></p> <hr> <h2>结果</h2> <h3>输入</h3> <pre><code>|||"field3"|"field4|"field5"|||

输出

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

说明

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