Вы захватываете деталь от начала до последней точки с запятой в группе, и после этого вы соответствуете закрывающей фигурной скобке.Но чтобы вернуть это в замену, вы должны обратиться к группе захвата.То, что вы сопоставили, не будет, потому что вы заменяете то, что вы сопоставили.
Чтобы исправить свое регулярное выражение, вы можете захватить последние }
в группе ^(\@something\s*{(?:\n.*)*?\n)(})
и в замене обратиться к этим группам.
const regex = /^(\@something\s*{(?:\n.*)*?\n)(})/gm;
const str = `@something {
color: red;
background: yellow;
}`;
const subst = `$1 heyaa\n$2`;
const result = str.replace(regex, subst);
console.log(result);
Чтобы принять во внимание начало строки и отступ последней строки, вы можете сопоставить первую строку, а затем повторить, не глядя на новую строку, а затем}
.
Вы можете захватить пробельные символы в начале в группе захвата и сослаться на это в замене, чтобы соответствовать отступу для heyaaa
:
^(@[^{]+{\s*(?:(?!\n})(\s+).*\n)*)(})
Объяснение шаблона
^
Старт (
Группа захвата @[^{]+{\s*
Совпадение @
, 1 + время не {
.Затем сопоставьте {
и 0+ с символом пробела (?:
Группа без захвата (?!\n})(\s+).*\n
Подтвердите, что справа нет новой строки, за которой следует }
.Если это так, сопоставьте всю строку с новой строкой
)*
Закройте группу и повторите 0+ раз
)
Закрыть группу захвата (})
Круглая скобка захвата захвата $
Конец
При замене вы можете использовать 3 группы захвата:
$1$2heyaaa\n$3
Regex demo
Используя функцию обратного вызова, ваш код может выглядеть следующим образом:
.pipe(replace(/^(@[^{]+{\s*(?:(?!\n})(\s+).*\n)*)(})/, function(_,g1,g2,g3) {
return g1 + g2 + "heyaaa\n" + g3; }
)
)
const regex = /^(@[^{]+{\s*(?:(?!\n})(\s+).*\n)*)(})/gm;
const str = `@something {
color: red;
background: yellow;
}`;
const subst = `$1$2heyaaa\n$3`;
const result = str.replace(regex, subst);
console.log(result);