Мое предложение здесь состоит в том, чтобы использовать библиотеку, которая может анализировать объект в правилах, как предложено @ Jakub.
В этом ответе используется следующее регулярное выражение /#(?!:[\w]+)(?=([\w\d\[\]\,\*\=\>\.\s]*[\{\,\[]+))/g
, которое должно эффективно соответствовать#
при прохождении группы без записи (представляющей сам Id), которая, в свою очередь, переходит группу позитивного просмотра (в виде последовательности слова (a-zA-Z0-9_
) и специальных символов, включая пробелы и символы новой строки, которые обрабатываются {
,,
, [
).
var outputElm = document.getElementById("output");
var importedCode = `div#xyz, #xyz, div#xyz[id='xyz'],
.def>#xyz, .def>div#xyz, .def>#xyz,
.def>div#xyz[id=*]
{
color:#ee2ee2;
}
@media (min-width: 30em) and (orientation: landscape)
{
.abc{
background-color :#FFFFFF;
border-color:1px solid #eee ;
}
.def>#xyz, .def #xyz, .def>#xyz{border-color:1px solid #ddd;}
.def>#xyz>div, .def #xyz div, .def>#xyz>div.abc {border-color:1px solid #ddd;}
}`;
var replaceIdRegex = /#(?!:[\w]+)(?=([\w\d\[\]\,\*\=\>\.\s]*[\{\,\[]+))/g;
outputElm.innerText = importedCode.replace(replaceIdRegex, ".");
<p id="output">
</p>
Я провел довольно большое количество тестов по этому вопросу, но не могу сказать, что это не хрупко или может объяснить каждый сценарий.
Вы также можете протестировать эту реализацию на regex101 игровой площадке.