Помогите написать регулярное выражение c выделением части строки
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
Ответы (1 шт):
Автор решения: Matvei
→ Ссылка
Вместо того, чтобы бегать по искомым частям строки и применять к ним 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. В принципе, ваш код тоже работает, просто вы забыли в некоторых местах написать запятые, в ваших тестовых данных.