Помогите написать регулярное выражение c выделением части строки

Рейтинг: -2Ответов: 1Опубликовано: 23.02.2023

const markPartOfString = (string, substrings) => {
  if (!substrings) return string;
  const parts = substrings.split(',').map(str => str.trim());

  let markedString = string;
  parts.forEach(part => {
    const regex = new RegExp(`\\b${part}\\b`, 'gi');
    markedString = markedString.replace(regex, match => `<mark>${match}</mark>`);
  });

  return markedString;
}

//Expected result 
console.log(markPartOfString("wfo test3", "wfo test, wfo test3, wf te")); // <mark>wfo</mark><mark>test3</mark>
console.log(markPartOfString("wfo test", "wf")); // <mark>wf</mark>0 test
console.log(markPartOfString("wfo test", "wf te")); // <mark>wf</mark>o <mark>te</mark>st
console.log(markPartOfString("wfo test", "wfo")); // <mark>wfo</mark> test
console.log(markPartOfString("wfo test", "o st")); // wf<mark>o</mark> <mark>st</mark>est

Ответы

▲ 2Принят

Вместо того, чтобы бегать по искомым частям строки и применять к ним replace() метод, заменяющий только первое совпадение, можно использовать метод .replaceAll(), заменяющий все совпадения в строке.

const markPartOfString = (string, substrings) => {
  if (!substrings) return string;
  const parts = substrings.split(',').map(str => str.trim());

  const regex = new RegExp(`${parts.join('|')}`, 'gi');
  return string.replaceAll(regex, match => `<mark>${match}</mark>`);
}

//Expected result 
console.log(markPartOfString("wfo test3", "wfo, test3")); // <mark>wfo</mark><mark>test3</mark>
console.log(markPartOfString("wfo test", "wf")); // <mark>wf</mark>o test
console.log(markPartOfString("wfo test", "wf, te")); // <mark>wf</mark>o <mark>te</mark>st
console.log(markPartOfString("wfo test", "wfo")); // <mark>wfo</mark> test
console.log(markPartOfString("wfo test", "o, st")); // wf<mark>o</mark> te<mark>st</mark>

P.S. В принципе, ваш код тоже работает, просто вы забыли в некоторых местах написать запятые, в ваших тестовых данных.