忽略RegEx中字符前的空格

时间:2010-08-09 03:28:49

标签: javascript regex

作为在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中获得预期的输出?

2 个答案:

答案 0 :(得分:2)

你需要所谓的前瞻。它将匹配您提供的文本,但不包括在输出中。

pattern = new RegExp(attribute + ':\\s+.+?(?=\\s*[!;])');

(?=...)是预示,我允许前导空格和!;之一。我正在使用.+?,以便在前瞻中的第一个匹配项之前尽可能少地匹配(否则,它会在!important之前捕获;。< / p>

答案 1 :(得分:1)

我会用

'\\s*:\\s*([^\\s+!;]+(?:\\s+[^\\s+!;]+)*)'

如果有一些空格后面跟着更多的非空格/爆炸/分号字符,请将其视为属性值的延续。

我也改变了第一部分,因为冒号后之前的空格是可选的。

您也可以在开头添加'[\\s;]' +之类的内容。您拥有它的方式,color正则表达式将匹配colorbackground-color属性。