Замена слова в строке и его производных

Доброго времени суток!

Столкнулся с задачей,которую пытался сам решить,но ввиду малого опыта не понимаю как лучше подойти к ее решению

Допустим есть текст:

'Мы посмотрели, а там - пожар! И не просто пожар, а пожарище! Полыхало так, что наш пожар было видно за горами, и не просто пожар или пожарчик, а пожарище!'

Задание: написать функцию,которая будет заменять строку "пожар" и все его производные на "...".

Пытался решить сам:

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 шт):

Автор решения: Grundy

Достаточно указать в регулярном выражении, что после основы пожар могут идти еще русские буквы: /пожар([а-яё]+)?/g

Для замены лучше воспользоваться методом .replace

console.log(
  'Мы посмотрели, а там - пожар! И не просто пожар, а пожарище! Полыхало так, что наш пожар было видно за горами, и не просто пожар или пожарчик, а пожарище!'.replace(/пожар([а-яё]+)?/g, "...")
);

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

Для их исключения нужно воспользоваться Non-capturing group, обозначающимися (?:x)

console.log(
  'Мы посмотрели, а там - пожар! И не просто пожар, а пожарище! Полыхало так, что наш пожар было видно за горами, и не просто пожар или пожарчик, а пожарище!'.split(/пожар(?:[а-яё]+)?/).join("...")
);

→ Ссылка
Автор решения: MoloF

Исходя из ответа @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));

→ Ссылка