正则匹配被单引号包裹的单引号,实现单引号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
相关产品推荐
相关产品推荐

