【问题标题】:Java regex - remove quotes unless preceded by odd number of backslashes [duplicate]Java regex - 删除引号,除非前面有奇数个反斜杠[重复]
【发布时间】:2018-12-11 17:24:13
【问题描述】:

我正在使用正则表达式从字符串值中去除引号。这些字符串值可以包含转义的引号,也可以包含转义的反斜杠字符。

我不想删除转义引号,只删除非转义引号。但是,转义反斜杠字符位于非转义引号之前的情况会造成困难。

我想要如下结果:

"value"         ->  value
'value'         ->  value
"\"value\""     ->  \"value\"   <-- contains escaped quotes
"value\"        ->  value\"
"value\\"       ->  value\\     <-- contains escaped backslash before non-escaped quote
"""val"ue\\\""" ->  value\\\"

以下正则表达式几乎对我有用,除了当我只想转义双引号和单引号字符时,当引号前有偶数个反斜杠时,它也会剥离反斜杠。

(?<!\\\\)(?:\\\\{2})*[\"']

【问题讨论】:

  • 为什么"""val"ue\\\""" 会导致value\\\"" 介于 value 之间呢?
  • 我在想(["'])(?:\\.|.)*?\1 之类的东西来匹配整个引号(\. 用于匹配任何转义字符),但上面的例子让它变得更难了。
  • 您好,请查看两个标记的问题。他们肯定会帮助您移植。否则,请编辑您的问题以反映差异。

标签: java regex


【解决方案1】:

出现问题是因为您匹配了这些反斜杠并且它们被删除了。为了保留它们,捕获这些反斜杠,并替换为 $1 占位符:

s.replaceAll("((?<!\\\\)(?:\\\\{2})*)[\"']", "$1")

请参阅regex demo

((?&lt;!\\\\)(?:\\\\{2})*) 现在包裹在 (...) 中,您可以通过在替换模式中使用 $1 来引用在该组中捕获的值。

【讨论】:

  • 这对我来说效果很好。谢谢!
猜你喜欢
  • 2018-07-26
  • 1970-01-01
  • 2016-03-24
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多