【问题标题】:Ignoring whitespace immediately before a character in RegEx忽略正则表达式中字符之前的空格
【发布时间】:2010-08-09 11:46:16
【问题描述】:

作为在 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 不支持它们。

我也想过也许我可以指出类似 match while \\s+! or \\s+.+; is not true:也就是说,一旦在特定字符之前找到空格,就停止匹配,但我不确定如何在正则表达式中键入它。

我可以在第二步中轻松去除空格,但我想知道:有没有办法在一个 RegEx 中获得预期的输出?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

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

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

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

    【讨论】:

    • 这太棒了:我只想要rgb(... 部分(您的解决方案给出了color: rgb(...,但有了括号,我就能得到我正在寻找的东西:attribute + ':\\s+(.+?(?=\\s*[!;]))'。谢谢!
    • 这行得通。我会让:\s+(.+?)(?=\s*[!;]) 只捕获没有: 的属性。此外,JavaScript 不需要双重转义 \\s\s 工作正常。
    • @cnanney,我尝试过使用单转义,但是当我这样做时,\s 被完全忽略(好像它正在尝试匹配 s 我想)。
    • @Mark,你是对的 - 在文字字符串中,反斜杠必须被转义。我的错。
    【解决方案2】:

    我会用

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

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

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

    您可能还想在开头添加类似'[\\s;]' + 的内容。按照您的方式,color 正则表达式将匹配 colorbackground-color 属性。

    【讨论】:

    • 完美,我没有想到 colorbackground-color 的问题,或者冒号前可能有空格。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2023-01-16
    • 2021-09-13
    • 2020-08-06
    • 2011-08-12
    • 2011-06-03
    • 2022-11-30
    相关资源
    最近更新 更多