Сопоставьте каждый JSON (stringified) ключ и значение, используя одну группу регулярных выражений - PullRequest
1 голос
/ 04 ноября 2019

Я попытался /("(?:[^\"]|\")*?")/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» содержит двойные кавычки.

Ответы [ 3 ]

1 голос
/ 04 ноября 2019

Я не совсем понимаю, что вы ищете, давайте посмотрим, поможет ли это:

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]))
1 голос
/ 04 ноября 2019

Вы можете сделать это с помощью 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;\""
]
0 голосов
/ 05 ноября 2019

Я просто вернулся к вашему https://regex101.com/r/YTzXaV/4 примеру и избежал двойных кавычек, которые также экранированы в вашем примере кода, и использовал следующее регулярное выражение:

  • ("(?: [^ \ "] | \") *? [^ \\] ")

Единственная часть, которую я добавил, была [^ \\], так что последней двойной кавычке должен предшествовать любой символ, которыйне является обратной косой чертой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...