Заменить несколько строк, содержащих знак $ - PullRequest
0 голосов
/ 31 января 2019

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

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

<div class="$(unique-result) single-result data-index=$(i)"><div class="airport-data data-index=$(i)">$(name)<br>$(city) ,$(country)</div><div class="airport-code data-index=$(i)">$(IATA)</div></div>

, и мне нужно заменитьвсе $ (уникальный-результат) с моей строкой.

Я попробовал следующий код, но не могу понять, почему это не работает

string.replace(new RegExp('\\$(unique-result)', 'g'), changeString)

результат - та же самая строка, которую я дал в качестве ввода.

Кто-нибудь может мне помочь, но также указать, почему это не сработало?

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Вы можете использовать простую функцию, чтобы сделать замену.Соответствуйте каждому $(string) и применяйте функцию, чтобы заменить ее переменной, хранящейся в объекте.Легко и расширяемо.

const tpl = '<div class="$(unique-result) single-result data-index=$(i)"><div class="airport-data data-index=$(i)">$(name)<br>$(city) ,$(country)</div><div class="airport-code data-index=$(i)">$(IATA)</div></div>';

const vars = {
  i : 9,
  'unique-result' : 'uniq',
  country : 'gb',
  city : 'Manchester',
  IATA : 'MCH'
};

const replaceVars = (tpl,vars) => {
  const replacer = (m, m1) =>
      typeof vars[m1] != 'undefined' ? vars[m1] : '';
  return tpl.replace(/\$\(([\w-]+)\)/g, replacer);
};

console.log(replaceVars(tpl,vars));
0 голосов
/ 31 января 2019

Существует более общее решение.

Прежде всего, как я уже упоминал в комментариях, вам не нужно использовать конструктор RegExp, вы можете просто передать свое регулярное выражение между слешами и использовать флаги послепоследняя косая черта:

str.replace(/\$\(unique-result\)/g, "someValue")

Второй момент заключается в том, что String.prototype.replace может принимать функцию в качестве второго параметра.Это будет полезно, когда в вашей строке много именованных шаблонов.Например, у вас есть следующая входящая строка:

var incomingString = "$(first-value) says $(second-value) when there is $(third-value)"

С кодом, который вы предоставили, вы должны позвонить replace 3 раза.Но если вы будете использовать функцию в качестве второго параметра, это можно упростить до:

var incomingString = "$(first-value) says $(second-value) when there is $(third-value)"
var data = {
  "first-value": "Kappa",
  "second-value": "Hey!",
  "third-value": "GreyFaceNoSpace"
}
var resultString = incomingString.replace(/\$\(([^)]+)\)/g, (match, capture) => {
  console.log(match, capture)
  return data[capture]
})
console.log(resultString)

"ЧТО ПРОИСХОДИТ ЗДЕСЬ ?!"Вы, вероятно, спросите.Ничего сложного.

  1. Функция, передаваемая в качестве аргумента, принимает один или несколько аргументов: первый - полное совпадение, а остальные - захваченные группы.Он должен возвращать строку, которая должна заменить полное совпадение .
  2. В нашем регулярном выражении мы описали, что мы хотим сопоставить все возможные подстроки в формате \$\(([^)]+)\), где [^)]+ относитсяна один или более из любых символов, кроме закрывающей скобки , и эта конструкция должна быть захвачена (она находится между несанезизированными скобками).

Итак, когда это регулярное выражение будет соответствовать, оно передаст всю конструкцию $(...) в аргумент match переданной функции, а имя шаблона в аргумент capture.Так что capture является нашим ключом для хранения некоторых данных, и мы просто возвращаем это значение в функцию.

Вот и все!Надеюсь, это будет полезно :) 1041 *

0 голосов
/ 31 января 2019

Вы пропустили побег.вам нужно правильно убежать

let str = `<div class="$(unique-result) single-result data-index=$(i)"><div class="airport-data data-index=$(i)">$(name)<br>$(city) ,$(country)</div><div class="airport-code data-index=$(i)">$(IATA)</div></div>`

let op = str.replace(new RegExp('\\$\\(unique-result\\)','g'), 'Changed')

console.log(op)

Если я не использую переменную, я предпочитаю использовать regex literal (//)

let str = `<div class="$(unique-result) single-result data-index=$(i)"><div class="airport-data data-index=$(i)">$(name)<br>$(city) ,$(country)</div><div class="airport-code data-index=$(i)">$(IATA)</div></div>`

let op = str.replace(/\$\(unique-result\)/g, 'Changed')

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