В качестве упражнения в изучении RegEx на JavaScript я пытался выбрать значение атрибута в таблице стилей CSS.Учитывая следующий CSS:
foo {
color: rgb(0, 0, 0) !important;
background-color: rgb(0, 0, 0) !important;
border-left: 1px solid #111;
}
и функцию getStyle(css, attribute)
, такую, что getStyle(css, 'background-color')
возвращает "rgb(0, 0, 0)"
, я придумал следующий код:
function getStyle(css, attribute) {
var pattern = new RegExp(attribute + ':\\s+([^!;]+)');
return pattern.exec(css);
}
Thisподходит довольно близко: он совпадает, пока не достигнет !
или ;
, в зависимости от того, что наступит раньше.Но в случае getStyle(css, 'color')
он также возвращает пробел после rgb(0, 0, 0)
и до !important
:
color = "rgb(0, 0, 0) "
background-color = "rgb(0, 0, 0) "
border-left = "1px solid #111"
Я пробовал такие вещи, как attribute + ':\\s+([^\\s+!;]+)'
, но в итоге возвращается только rgb(0,
из-за пробелов в значении.Я также смог получить ожидаемый результат с помощью различных регулярных выражений и заглянуть за спину, но JavaScript их не поддерживает.
Я также подумал, что, возможно, я мог бы указать что-то вроде match в то время как \\s+!
или \\s+.+;
не соответствует действительности : то есть прекращать сопоставление, как только он находит пробел перед определенным символом, но я не уверен, как ввести это в регулярное выражение.
Я мог бы простотак же легко убрать пробел на втором шаге, но мне интересно: есть ли способ получить ожидаемый результат в одном RegEx?