Regex/Java 匹配缺少第二个引号的字段
Regex/Java match fields with missing second quote
我在加载到数据库中的几个文本文件中有一个竖线分隔的记录。事实证明,有时一个字段会以引号开头但不会以引号结尾,这会导致加载失败。这是一个示例记录
||field2|"field3"|"field4|"field5"|||
请注意,字段 4 缺少尾随引号。我想预处理文件并删除这些字段的前导引号,但我似乎无法想出一个有效的正则表达式
我试过前瞻和回顾组合,但始终匹配 |"field3"|"field4|
而不仅仅是 |"field4|
我需要查找 |"
的内容和一些没有管道的文本,以没有前导引号的管道结尾。
此正则表达式将查找所有 |
之前没有 "
的内容:
(?<!")\|
所以你用它:
String result = data.replaceAll("(?<!\")\|", "\"|");
在这段代码之后,您将把字符串替换为之前没有管道的所有 |
到 "|
遵循正则表达式
(?<=\|)"(?=[^|]*(?<!")\|)
匹配前面有文字 |
的 "
并且下一个 |
字符前面没有 "
。
您可以在正则表达式中使用否定的 class:
str = str.replaceAll("\|\"([^|]*[^\"|]\|)", "");
正则表达式解释:
"
:匹配双引号
|
:匹配一个管道字符
([^"|]*[^"|]\|)
:后跟0个或多个不是竖线的字符后跟非竖线、非引号字符后跟竖线。在组 #1
中也捕获这个
在替换中,只需使用捕获组 #1 的反向引用,使用
获取不带前导双引号的字段值。
代码
("[^|"]*")|"([^|"]*\|)
替换:</code></p>
<hr>
<h2>结果</h2>
<h3>输入</h3>
<pre><code>|||"field3"|"field4|"field5"|||
输出
|||"field3"|field4|"field5"|||
说明
- 满足以下任一条件
("[^|"]*")
将以下内容捕获到捕获组 1
"
字面匹配
[^|"]*
匹配集合中除一个字符以外的任意字符 |"
任意次数
"
字面匹配
"([^|"]*\|)
"
字面匹配
([^|"]*\|)
将以下内容捕获到捕获组 2
[^|"]*
匹配集合中除一个字符以外的任意字符 |"
任意次数
\|
按字面意思匹配 |
我在加载到数据库中的几个文本文件中有一个竖线分隔的记录。事实证明,有时一个字段会以引号开头但不会以引号结尾,这会导致加载失败。这是一个示例记录
||field2|"field3"|"field4|"field5"|||
请注意,字段 4 缺少尾随引号。我想预处理文件并删除这些字段的前导引号,但我似乎无法想出一个有效的正则表达式
我试过前瞻和回顾组合,但始终匹配 |"field3"|"field4|
而不仅仅是 |"field4|
我需要查找 |"
的内容和一些没有管道的文本,以没有前导引号的管道结尾。
此正则表达式将查找所有 |
之前没有 "
的内容:
(?<!")\|
所以你用它:
String result = data.replaceAll("(?<!\")\|", "\"|");
在这段代码之后,您将把字符串替换为之前没有管道的所有 |
到 "|
遵循正则表达式
(?<=\|)"(?=[^|]*(?<!")\|)
匹配前面有文字 |
的 "
并且下一个 |
字符前面没有 "
。
您可以在正则表达式中使用否定的 class:
str = str.replaceAll("\|\"([^|]*[^\"|]\|)", "");
正则表达式解释:
"
:匹配双引号|
:匹配一个管道字符([^"|]*[^"|]\|)
:后跟0个或多个不是竖线的字符后跟非竖线、非引号字符后跟竖线。在组 #1 中也捕获这个
在替换中,只需使用捕获组 #1 的反向引用,使用
获取不带前导双引号的字段值。
代码
("[^|"]*")|"([^|"]*\|)
替换:</code></p>
<hr>
<h2>结果</h2>
<h3>输入</h3>
<pre><code>|||"field3"|"field4|"field5"|||
输出
|||"field3"|field4|"field5"|||
说明
- 满足以下任一条件
("[^|"]*")
将以下内容捕获到捕获组 1"
字面匹配[^|"]*
匹配集合中除一个字符以外的任意字符|"
任意次数"
字面匹配
"([^|"]*\|)
"
字面匹配([^|"]*\|)
将以下内容捕获到捕获组 2[^|"]*
匹配集合中除一个字符以外的任意字符|"
任意次数\|
按字面意思匹配|