使用一个正则表达式组匹配每个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"','"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;
"""
 }
]

如果“源”值包含双引号,则不起作用。

liyaozong 回答:使用一个正则表达式组匹配每个JSON(字符串化)键和值

如果您两次转义反斜杠,则可以使用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","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示例,转义了在代码示例中也转义的双引号,并使用了以下正则表达式:

  • (“(?:[^ \”] | \“)*?[^ \\]”)

我添加的唯一部分是[^ \\],因此最后一个双引号之前必须是非反斜杠的任何字符

本文链接:https://www.f2er.com/3164082.html

大家都在问