【问题标题】:How can I substitute single chars with empty string and double with single in Java using Regex?java - 如何使用Regex在Java中用空字符串替换单个字符并用单个字符替换双倍?
【发布时间】:2019-12-21 21:34:46
【问题描述】:

问题:

我必须解析 CSV 文件,引用了一些行。 我已经正确拆分了所有列,我需要删除单引号并替换转义引号。

这里有一些我必须处理的例子:

["] -> []
[""] -> ["]
["""] -> ["]
[""""] -> [""]

["ab"c] -> [abc]
["Venture ""Extended Edition, Very Large"""] -> [Venture "Extended Edition, Very Large"]

这是我目前得到的:

https://regex101.com/r/4uGEzN/1

我尝试使用“Groups”和“Positive Lookahead”编写一些正则表达式,但没有达到结果。可以帮忙吗?

【问题讨论】:

  • 你想用"a",""b"",""""c"""",""""做什么?它似乎不是一个有效的字符串。您可以做的是使用(?m)(?<=,|^)"([^"]*(?:""[^"]*)*)"(?=$|,) 匹配逗号之间的任何"....",然后替换为Group 1 值中带有替换的(.replace("\"\"", "\"")) 引号的版本。如果条目是有效的 CSV 字符串,它将起作用。
  • 逗号可以忽略,我需要把"a" ""b"" """"c"""" """" """这样的字符串转换成a "b" ""c"" "" "
  • 让我们看看所有"都被转义了
  • 嗯,这并没有把事情弄清楚。考虑到标题,我可以建议.replaceAll("(?<!\")\"(?!\")|(\")\"", "$1")(这是Java)。请参阅this regex demo(抱歉,由于 regex101 已关闭,必须编辑链接)
  • 这正是我所寻找的。谢谢!

标签: regex


【解决方案1】:

你可以使用

(")"|"

替换为$1。请参阅regex demo。

模式详情

  • (")" - 将 " 捕获到第 1 组,然后在其后立即使用另一个报价
  • | - 或
  • " - 匹配单个 " 字符。

在 Java 中,您可以将此模式与 .replaceAll 一起使用:

text = text.replaceAll("(\")\"|\"", "$1");

【讨论】:

  • "\"Venture \"\"Extended Edition\"\"\"" 的奇怪行为最后一个引号有问题
  • @mkUltra 那么精确的要求。示例不是很有帮助。
  • 每个单引号折叠成空字符,每个双引号折叠成一个单引号。在树引号的情况下,前两个应该折叠成一个,e 最后一个从单引号中消失。
  • @mkUltra 试试.replaceAll("(\")\"|\"", "$1")
  • 感谢您的帮助。两者结合效果很好:(?<!\")\"(?!\")|(\")\"|\"
猜你喜欢
  • 2020-07-19
  • 2019-12-26
  • 1970-01-01
  • 2017-02-24
  • 2013-05-11
  • 1970-01-01
  • 2014-07-23
  • 1970-01-01
相关资源
最近更新 更多