javascript - 使用一个正则表达式组匹配每个 JSON(字符串化)键和值
问题描述
我试过了/("(?:[^\"]|\")*?")/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 编辑器值是一个字符串,而不是一个对象。包含 \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;\""
]
推荐阅读
- dependencies - 将 web3.js 添加到项目时出现 require.js 的问题
- ubuntu - ubuntu 16 上的 Shiny-server 错误:“无法打开与 X11 显示器的连接”
- php - 在 Laravel 中一对多播种关系
- python - 如何从 Tkinter 画布文本项中删除 icursor?
- composer-php - Composer:在 Mac 上找不到命令
- javascript - 如何将点击处理程序/任何事件处理程序附加到我的对象或模块
- javascript - Blazor 互操作 LocalStorage 0.4.0 更改为 0.5.1
- meshlab - Meshlab - 纹理映射分辨率
- python-3.x - 如何从另一个 python 脚本退出一个 python 脚本但保持第一个 python 脚本运行?
- python - 在 Pandas Dataframe 中按天连接字符串列表