【问题标题】:Replacing some special characters between quotes替换引号之间的一些特殊字符
【发布时间】:2017-08-12 22:11:45
【问题描述】:

我想替换 JSON 字符串中的点和单撇号字符,即仅在引用时。使用此输入:

String json = "{\"someJsonMap\":{\"with.dot.s\":1.0,\"'with.dots'.and.apostroph's.\":20.001}}";

我想转这个:

{"someJsonMap":{"with.dot.s":1.0,"with.dots'.and.apostroph's":20.001}}

进入这个:

{"someJsonMap":{"withdots":1.0,"withdotsandapostrophs":20.001}}

感谢任何帮助、解决方案或解释。

【问题讨论】:

  • 不是我的反对意见,但您最有可能在这里使用 JSON 解析器。即使你用正则表达式破解它,如果以后结构发生变化,你的代码也很容易崩溃。
  • 正确使用正则表达式有点棘手。例如考虑{"with.dot.and\"quote": 1}
  • @Henry 这是一个引号字符,而不是撇号字符
  • 感谢您的 cmets,我想我会按照建议的安全原因使用解析器。

标签: java regex quotes replaceall


【解决方案1】:

如果从来没有转义引号,那么您使用前瞻来查找后面的 奇数 个引号。奇数表示您在引号内。

json = json.replaceAll("['.](?=(([^\"]*\"){2})*[^\"]*\"[^\"]*$)", "");

一个正则表达式的火车残骸通过消耗多个引号(0-n 通过*)断言后面有奇数个引号([^\"]*\"){2},其余字符只有一个引号[^\"]*\"[^\"]*$

如果有转义引号,则基本上不能使用正则表达式。

【讨论】:

  • 谢谢!由于您的解释,我接受了您的回答,并且它按预期工作。即使在我的用例中不应该有任何转义引号,我也无法确定这一点,因此将使用 JSON 解析器。
猜你喜欢
  • 1970-01-01
  • 2016-06-13
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
相关资源
最近更新 更多