Заменить контент между комментариями

Я хотел бы заменить содержимое, которое находится между двумя комментариями, как

/**** 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*
                                                 ^^^

Живая демо

Другие вопросы по тегам