Замена слова в строке и его производных
Доброго времени суток!
Столкнулся с задачей,которую пытался сам решить,но ввиду малого опыта не понимаю как лучше подойти к ее решению
Допустим есть текст:
'Мы посмотрели, а там - пожар! И не просто пожар, а пожарище! Полыхало так, что наш пожар было видно за горами, и не просто пожар или пожарчик, а пожарище!'
Задание: написать функцию,которая будет заменять строку "пожар" и все его производные на "...".
Пытался решить сам:
function mchs(str) {
const fire = /пожар/
let newStr = str.split(fire).join('~~');
return newStr;
}
Но тут я просто не могу еще разобраться как в регулярное выражение добавить еще элементы для поиска (пока ищу в интернете)
function mchs(str) {
let newStr = str.split(' ').map((item) => item.includes('пожар') ? item = `...` : item).join(' ');
return newStr;
}
Да, этот вариант вроде работает, НО он стирает все знаки препинания с собой (пожар!, становится ... без знака !. Аналогично по всему остальному текту)
Ответы (2 шт):
Достаточно указать в регулярном выражении, что после основы пожар могут идти еще русские буквы: /пожар([а-яё]+)?/g
Для замены лучше воспользоваться методом .replace
console.log(
'Мы посмотрели, а там - пожар! И не просто пожар, а пожарище! Полыхало так, что наш пожар было видно за горами, и не просто пожар или пожарчик, а пожарище!'.replace(/пожар([а-яё]+)?/g, "...")
);
Если очень хочется использовать именно .split, стоит помнить особенность, что в выходной массив будут входить разделители указанные в группах.
Для их исключения нужно воспользоваться Non-capturing group, обозначающимися (?:x)
console.log(
'Мы посмотрели, а там - пожар! И не просто пожар, а пожарище! Полыхало так, что наш пожар было видно за горами, и не просто пожар или пожарчик, а пожарище!'.split(/пожар(?:[а-яё]+)?/).join("...")
);
Исходя из ответа @Grundy можно дополнить регулярное выражение не просто заменой на какие-то символы, а заменой тем количеством символов, что и найденная строка.
Таким образом можно точно определить количество букв.
Документация по: String.prototype.replace()
const text = 'Мы посмотрели, а там - пожар! И не просто пожар, а пожарище! Полыхало так, что наш пожар было видно за горами, и не просто пожар или пожарчик, а пожарище!';
const regexp = /пожар([а-яё]+)?/g;
const replace_word = '[]';
const replacerCallback = (match) => replace_word.repeat(match.length)
console.log(text.replace(regexp, replacerCallback));