javascript - замена строки, замените «^» на «» и «^^» на «^» - PullRequest
3 голосов
/ 22 июня 2019

Удаление временных символов Escape в JavaScript ...

Базовый пример:

У меня есть следующая строка:

"[x^::^^y]"

И вывод должен быть:

"[x::^y]"

По существу, любые вхождения ^, которые не соседствуют с другим ^, должны быть удалены, а любые вхождения ^^ должны быть заменены на ^

Дополнительные примеры:

.parse("[^^x:^y^:^^^^^^]") // output: "[^x:y:^^^]"
.parse("[^x:^^^^y^^^z]") // output: "[x:^^y^z]"

Это будет часть сценария синтаксического анализа для альтернативы JSON, которую я разрабатываю, чтобы, надеюсь, уменьшить размеры файлов для файлов внутреннего хранилища.

Ответы [ 4 ]

6 голосов
/ 22 июня 2019

Я бы использовал .replace() с функцией замены, подобной этой:

function parse (str) {
  return str.replace(/\^{1,2}/g, s => s.slice(1));
}

console.log(parse('[x^::^^y]'));
console.log(parse('[^^x:^y^:^^^^^^]'));
console.log(parse('[^x:^^^^y^^^z]'));
4 голосов
/ 22 июня 2019

Еще одна идея: Захватить одну ^ пар до $1 или не захватывать оставшиеся и заменить на $1.

function parse (s) {
  return s.replace(/(\^)\^|\^/g, '$1');
}

console.log(parse('[^x:^^^^y^^^z]'));
2 голосов
/ 22 июня 2019

Прекрасные ответы выше !!

Но еще один способ сделать это - использовать взгляд вперед и взгляд назад.

function replace_carets(mystring) {
  return mystring
    .replace(/(?<!\^)(\^{2})*\^(?!\^)/g, "$1") //removes isolated ^ or last odd numbered ^
    .replace(/\^{2}/g, "^"); //replaces ^^ with ^
}
console.log(replace_carets("[x^::^^y]"));
console.log(replace_carets("[^^x:^y^:^^^^^^]"));
console.log(replace_carets("[^x:^^^^y^^^z]"));

Далеко не элегантно, но я поставил перед собой задачу сделать это в качестве альтернативы, чтобы поделиться с вами.

2 голосов
/ 22 июня 2019

Поскольку вызов замены будет работать со всей строкой, две замены, если они выполняются одна за другой, будут мешать друг другу. Независимо от порядка, в котором вызываются замены, это всегда приведет к неверному результату.

Единственный способ решить эту проблему - использовать промежуточное состояние. Например, если бы мы использовали + в качестве промежуточного символа, это было бы что-то вроде:

  1. Заменить ^^ на +,
  2. Разбрасывается заменой ^ на пустую строку,
  3. Затем заменить + на ^

Очевидно, что + символ может появиться в самой исходной строке, поэтому вам нужно выбрать лучший промежуточный символ, который не будет отображаться в исходной строке. Это может быть многосимвольный или даже контрольный символ.

РЕДАКТИРОВАТЬ : Принятый ответ на использование функции заменителя является гораздо лучшим подходом для JS. Я оставляю этот ответ здесь на тот случай, если кто-то наткнется на этот вопрос с аналогичной проблемой на другом языке, где функции заменителя недоступны.

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