我有这行JSON文本:
{"schemaText":{"fields":[{"name":"AX_SND_TYPE","type":"string"},{"name":"BWORK","type":"int"}],"name":"XXXSchema","type":"record"},"description":"Autogenerated by NiFi"}
可以看出,有一个名为“ schemaText”的属性,其中包含一个对象,我想将其转换为字符串,因此,我唯一要做的就是在属性的开头和结尾添加引号并转义里面的引号。
使用下面的正则表达式(不是我的正则表达式知识真的很低),我就能执行第一步:
({"schemaText":)(\{"fields":\[.*)(,"description.*)
使用替换
$1"$2"$3
给出结果:
{"schemaText":"{"fields":[{"name":"AX_SND_TYPE","type":"string"},{"name":"BWORK","type":"int"}],"name":"XXXSchema","type":"record"}","description":"Autogenerated by NiFi"}
但是仍然有必要避免引号引起来:
{"schemaText":"{\"fields\":[{\"name\":\"AX_SND_TYPE\",\"type\":\"string\"},{\"name\":\"BWORK\",\"type\":\"int\"}],"name":"XXXSchema","type":"record"}","description":"Autogenerated by NiFi"}
具有有效的JSON格式。
问题是:是否可以在同一正则表达式中转义$ 2捕获组中的引号?
谢谢。
答案 0 :(得分:1)
仅供参考,您实际上可以使用以下表达式在每个发生替换的位置匹配:
/({"schemaText":)|}(,"description")(.*)|([^"]*)"/g
正如其他人所提到的,唯一的问题是您想做的不只是比赛;您想执行“条件替换”,因为不存在一个涵盖所有3种情况的通用替换(插入"
,在引号前插入\
,插入结尾"
)。
实际上,您可以通过一个replace()调用来完成此操作:
var test = "{\"schemaText\":{\"fields\":[{\"name\":\"AX_SND_TYPE\",\"type\":\"string\"},{\"name\":\"BWORK\",\"type\":\"int\"}],\"name\":\"XXXSchema\",\"type\":\"record\"},\"description\":\"Autogenerated by NiFi\"}";
window.alert(test.replace(/({"schemaText":)|}(,"description")(.*)|([^"]*)"/g, function(a,b,c,d,e){ return (b=="{\"schemaText\":"?b+"\"":(c==",\"description\""?"}\""+c+d:e+"\\\"")) })));
因此,从技术上讲,它是“同一个正则表达式”,但是替换参数使用内联函数作为替换而不是静态字符串。