Как сделать множественную замену с помощью регулярного выражения, где термин для замены хранится в переменной? - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть строка, которая выглядит ниже

givenText = "#0How #0much #0sales #0in #0batu #0where #0discount #0on #0sales?"

У меня есть словарь, который выглядит ниже

termAssignment = {"sales": "#4", "batu": "#2"}

Теперь я хочу заменить термины в строке, которые соответствуют ключи словаря. Но, как вы можете видеть, два термина в строке, которые соответствуют ключам, это sales и batu. Но я также хочу заменить #n, связанный с условиями.

Так что в основном конечный результат должен быть

"#0How #0much #4sales #0in #2batu #0where #0discount #0on #4sales?"

Так что, если я сделаю что-то подобное

for(word in termAssignment) {
      if(givenText.includes(word)) {
          replaceTerm = "#0" + word
          givenText = givenText.replace(/replaceTerm/g, termAssignment[word] + word)
      }
  }

Но это ничего не даст, так как мне нужно применить global заменить на строку, и мне присвоили эту строку переменной.

Как связать регулярное выражение с переменной и заменить?

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

В качестве альтернативы вы можете использовать split и map, без необходимости RegExp. Что-то вроде:

const givenText = "#0How #0much #0sales #0in #0batu #0where #0discount #0on #0sales?";
const terms = Object.entries({"sales": "#4", "batu": "#2"});
const parsed = givenText.split(` `)
  .map(v => {
    const term =  terms.find(t => v.includes(t[0]));
    return term ? `${term[1]}${v.slice(2)}` : v;
   })
  .join(` `);
  
console.log(parsed);

// can be simplified to
const parsed2 = givenText.split(` `)
  .map(v => `${(terms.find(t => v.includes(t[0])) || [``,`#0`])[1]}${v.slice(2)}`)
  .join(` `);

console.log(parsed2);
.as-console-wrapper { top: 0; max-height: 100% !important; }
1 голос
/ 22 февраля 2020

Вы можете соединить клавиши с помощью |, перейти к new RegExp, с #\d+ слева, а затем использовать функцию замены. Убедитесь, что деталь после #n находится в промежуточной группе захвата, затем найдите значение сопоставленной группы захвата (ключ) для объекта и замените его следующим значением:

const givenText = "#0How #0much #0sales #0in #0batu #0where #0discount #0on #0sales?";
const termAssignment = {"sales": "#4", "batu": "#2"};
const pattern = new RegExp(
  `#\\d+(?=(${Object.keys(termAssignment).join('|')}))`,
  'g'
);

const result = givenText.replace(pattern, (_, key) => termAssignment[key]);
console.log(result);

Для этого случая сгенерированный шаблон будет иметь вид:

#\d+(?=(sales|batu))

Он соответствует #, за которым следуют одна или несколько цифр, а затем захватывает Слово, которое следует для использования в замене. В функции замены полное совпадение, например #0, в переменной _ не используется, но вторым аргументом является то, что содержится в первой группе захвата, поэтому оно будет sales или batu , Поэтому все, что вам нужно сделать, - это посмотреть, какое свойство объекта и вернуть его, чтобы часть #n была заменена на соответствующее число.

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