正则表达式:是否可以在捕获组内进行替换?

时间:2018-09-12 09:44:23

标签: json regex avro confluent-schema-registry

我有这行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捕获组中的引号?

谢谢。

1 个答案:

答案 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+"\\\"")) })));

因此,从技术上讲,它是“同一个正则表达式”,但是替换参数使用内联函数作为替换而不是静态字符串。