作为在JavaScript中学习RegEx的练习,我一直在尝试在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);
}
这非常接近:匹配到达!
或;
,以先到者为准。但是对于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不支持它们。
我还想过,在\\s+!
或\\s+.+;
不是真的时,我可能会指出类似匹配的东西:也就是说,一旦找到空格,就停止匹配一个特定的角色,但我不确定如何在正则表达式中键入。
我可以在第二步中轻松剥离空白,但我想知道:有没有办法在一个RegEx中获得预期的输出?
答案 0 :(得分:2)
你需要所谓的前瞻。它将匹配您提供的文本,但不包括在输出中。
pattern = new RegExp(attribute + ':\\s+.+?(?=\\s*[!;])');
(?=...)
是预示,我允许前导空格和!;
之一。我正在使用.+?
,以便在前瞻中的第一个匹配项之前尽可能少地匹配(否则,它会在!important
之前捕获;
。< / p>
答案 1 :(得分:1)
我会用
'\\s*:\\s*([^\\s+!;]+(?:\\s+[^\\s+!;]+)*)'
如果有一些空格后面跟着更多的非空格/爆炸/分号字符,请将其视为属性值的延续。
我也改变了第一部分,因为冒号后和之前的空格是可选的。
您也可以在开头添加'[\\s;]' +
之类的内容。您拥有它的方式,color
正则表达式将匹配color
和background-color
属性。