You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则匹配被单引号包裹的单引号,实现单引号JSON转ES批量加载格式

嘿,我刚好处理过一模一样的需求!要把这种用单引号写的不规范JSON转换成Elasticsearch批量加载能用的标准格式,核心难点就是精准区分哪些单引号是用来做JSON结构分隔的,哪些是字符串内容里要保留的。

核心思路

我们需要替换的是作为JSON结构符号的单引号(也就是包裹键名、键值的那些成对单引号),而完全保留字符串内容里的单引号(比如Charlie's里的撇号,或者示例中'movie'里的单引号)。

正则表达式方案

这里可以用一个基于前后断言的正则来精准匹配需要替换的单引号:

'(?=\s*(?:[:,}]))|(?<=\s*(?:[{:,]))'

正则逻辑拆解

  • '(?=\s*(?:[:,}])):匹配值的结束单引号——也就是后面跟着可选空格,再加上:、,或}的单引号。比如示例里'Charlie's Angels',最后那个单引号,后面是逗号,会被匹配到。
  • (?<=\s*(?:[{:,]))':匹配键的起始单引号——也就是前面跟着可选空格,再加上{、:或,的单引号。比如示例里{ 'title'第一个单引号,前面是{ ,会被匹配到。

代码示例(Python)

import re

# 你的原始单引号JSON字符串
raw_json = "{ 'title': 'Charlie's Angels', 'review': 'I don't really like this 'movie'' }"
# 执行替换
formatted_json = re.sub(r"'(?=\s*(?:[:,}]))|(?<=\s*(?:[{:,]))'", '"', raw_json)

print(formatted_json)

运行后输出的结果正好是你要的:

{ "title": "Charlie's Angels", "review": "I don't really like this 'movie'" }

小补充

如果你的原始字符串里有转义的单引号(比如Charlie\'s),可以把正则调整成下面这样,避免误替换转义后的单引号:

'(?<!\\)(?=\s*(?:[:,}]))|(?<=\s*(?:[{:,]))(?!\\)'

内容的提问来源于stack exchange,提问作者dg1996

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:37:23