Заменить контент между комментариями
Я хотел бы заменить содержимое, которое находится между двумя комментариями, как
/**** Useless CSS ****/
.my-class{
margin: 12px;
}
/* Several Lines after including other comments **/
/**** END Useless CSS ****/
.other {
padding: 12px;
}
/* Hello */
Пока что у меня есть:
[\/* Useless CSS \*\/](.|[\r\n])*?END Useless CSS \*\*\*\*\/?
Но это не работает. Я получил ошибку в Regex101: катастрофический откат
3 ответа
Часть вашего вопроса - это первая часть вашего регулярного выражения. Вы используете [\/* Useless CSS \*\/]
класс символов, который означает любой символ в этом наборе. Другими словами, любой из следующих символов (после удаления повторяющихся букв): /* UselCS
, Это определенно не ваше намерение, но это то, что он делает. Приведенный ниже код удаляет класс символов из шаблона, чтобы он соответствовал /**** Useless CSS ****/
в явном виде.
Второе изменение превращается (.|[\r\n])*?
в [\s\S]*?
, Нет необходимости каждый раз проверять регулярные выражения по двум параметрам. Если это набор символов, просто добавьте их в тот же класс символов. [\s\S]
это способ представления любого символа (включая символ новой строки). Другой способ (работает в JavaScript, но не во многих других движках регулярных выражений) - это использовать [^]
,
Третье изменение менялось \*\*\*\*
в \*{4}
, Это не только короче и проще для понимания, но и повышает производительность, потому что движку регулярных выражений не нужно идти токен за токеном \*
, затем \*
, затем \*
и т.д. Это сказано, чтобы соответствовать *
четыре раза, так что он делает это за один раз вместо 4. Это означает, что \*\*\*\*
делает четыре шага в то время как \*{4}
только занимает один
Вы также можете добавить \s*
до конца, чтобы удалить дополнительные пробелы.
\/\*{4} Useless CSS \*{4}\/[\s\S]*?\/\*{4} END Useless CSS \*{4}\/
var s = `/**** Useless CSS ****/
.my-class{
margin: 12px;
}
/* Several Lines after including other comments **/
/**** END Useless CSS ****/
.other {
padding: 12px;
}
/* Hello */`
var r = /\/\*{4} Useless CSS \*{4}\/[\s\S]*?\/\*{4} END Useless CSS \*{4}\//gi
console.log(s.replace(r, ''))
То, что вы можете использовать регулярные выражения, не означает, что вы должны использовать регулярные выражения.
let css = `
.boat {
float: left;
}
/**** Useless CSS ****/
.my-class{
margin: 12px;
}
/* Several Lines after including other comments **/
/**** END Useless CSS ****/
.other {
padding: 12px;
}
/* Hello */`;
const START_DELIMITER = '/**** Useless CSS ****/';
const END_DELIMITER = '/**** END Useless CSS ****/';
const left = css.slice(0, css.indexOf(START_DELIMITER));
const right = css.slice(css.indexOf(END_DELIMITER) + END_DELIMITER.length);
console.log(left + 'NEW STUFF' + right);
Ваше регулярное выражение почти работает, но вы должны учитывать некоторые изменения, представленные ниже:
(\/\*+ Useless CSS \*+\/)(.|[\r\n])*?END Useless CSS \*\*\*\*\/
^ ^ ^ ^ ^
Пояснения:
- изменения
[...]
в(...)
, Прежний определяет класс персонажа, последний - группу. Спасаясь
*
для выражения буквального символа, который в противном случае работает как квантор регулярного выраженияКоличественная
\*
с+
соответствовать*
символы в последовательности.
также (.|[\r\n])
который должен соответствовать любому персонажу до определенной точки, является плохой альтернативой [\s\S]
или же [^]
(в JS). Кроме того, я бы добавил \s*
в конце шаблона, чтобы соответствовать левым пробелам:
\/\*+ Useless CSS \*+\/[^]*?END Useless CSS \*+\/\s*
^^^