我尝试了/("(?:[^\"]|\")*?")/g
const string = `[
{
"name": "total_4_dials_time","type": "transform","source": "long total_nodes = data.nodestats._nodes.total;\nmap res = [:];\nres[\"nodes\"] = data.nodestats._nodes.total;\nlong millis = System.currentTimeMillis();\nres[\"@time\"] = millis;\nreturn res;"
}
]`;
const regexJSONKeysAndValues = new RegExp('("(?:[^\"]|\")*?")','g');
const result = string.match(regexJSONKeysAndValues);
console.log(result);
然后将“源”值拆分为三个字符串,其中“ \”。我不需要将“源”值拆分。
[
'"name"','"total_4_dials_time"','"type"','"transform"','"source"','"long total_nodes = data.nodestats._nodes.total;\nmap res = [:];\nres["','"] = data.nodestats._nodes.total;\nlong millis = System.currentTimeMillis();\nres["','"] = millis;\nreturn res;"'
]
要使用什么正则表达式来获得以下结果?
[
'"name"','"long total_nodes = data.nodestats._nodes.total;\nmap res = [:];\nres["nodes"] = data.nodestats._nodes.total;\nlong millis = System.currentTimeMillis();\nres["@time"] = millis;return res;"'
]
这是我的正则表达式游乐场,上面有一个示例https://regex101.com/r/YTzXaV/4
我的自定义ace editor模式需要此功能。 Ace编辑器的值是一个字符串,而不是一个对象。包含\ n的值必须用三引号引起来。例如,
const string = `[
{
"name": "total_4_dials_time","source": "long total_nodes = data.nodestats._nodes.total;\nmap res = [:];\nres['nodes'] = data.nodestats._nodes.total;\nlong millis = System.currentTimeMillis();\nres['@time'] = millis;\nreturn res;"
}
]`;
const unfoldMultiLinestring = (string = '') => {
const regexJSONKeysAndValues = new RegExp('("(?:[^\"]|\")*?")','g');
return string.replace(regexJSONKeysAndValues,(match,value) => {
const areNewLines = value.includes('\n');
if (areNewLines) {
return `"""\n${value.slice(1,value.length - 1)}\n"""`;
}
return value;
});
};
console.log(unfoldMultiLinestring(string));
结果:
[
{
"name": "total_4_dials_time","source": """
long total_nodes = data.nodestats._nodes.total;
Map res = [:];
res['nodes'] = data.nodestats._nodes.total;
long millis = System.currentTimeMillis();
res['@time'] = millis;
return res;
"""
}
]
如果“源”值包含双引号,则不起作用。