Я попытался /("(?:[^\"]|\")*?")/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);
И получил значение "source", разделенное на три строки, где есть \ ". Мне не нужно разделять значение" source ".
[
'"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
Мне нужно это для моего кастомного тузаредактор mode. Значение Ace editor - это строка, а не объект. Значения, содержащие \ 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;
"""
}
]
Не работает, если значение «source» содержит двойные кавычки.