[英]Match every JSON (stringified) key and value using one regex group
我試過/("(?:[^\"]|\")*?")/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"',
'"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;return res;"'
]
這是我的正則表達式操場,示例https://regex101.com/r/YTzXaV/4
我需要這個用於我的自定義ace 編輯器模式。 Ace 編輯器值是一個字符串,而不是 object。 包含 \n 的值必須用三引號括起來。 例如,
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 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",
"type": "transform",
"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;
"""
}
]
如果“源”值包含雙引號,則它不起作用。
如果您對反斜杠進行雙重轉義,則可以使用JSON.parse
執行此操作,因此\
=> \\
:
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 parsed = JSON.parse(string); const result = Object.keys(parsed[0]).flatMap(k => [k, parsed[0][k]]).map(JSON.stringify); console.log(result);
結果:
[
"\"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;\""
]
我不完全明白你在找什么,讓我們看看這是否有幫助:
function pythonify(obj) { let out = Object.entries(obj).map(([k, v]) => { if (typeof v === 'string' && v.includes('\n')) v = '"""\n' + v + '\n"""'; else v = JSON.stringify(v) return ' ' + JSON.stringify(k) + ': ' + v; }); return '{\n' + out.join(',\n') + '\n}' } // const string = String.raw`[ { "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;" } ]`; console.log(pythonify(JSON.parse(string)[0]))
我剛剛回到您的https://regex101.com/r/YTzXaV/4示例並轉義了在您的代碼示例中也轉義的雙引號,並使用了以下正則表達式:
我添加的唯一部分是 [^\\] 以便最后一個雙引號前面必須有任何不是反斜杠的字符
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.