【问题标题】:Match only whitespaces inside {}仅匹配 {} 内的空格
【发布时间】:2009-08-25 01:26:48
【问题描述】:

假设我得到了以下要匹配的字符串:

#sidebar h1 ul li{ #a:hover; height : 100px ;color: #fffff ; font-family: @fonts; }

我想要的是只匹配大括号 { } 中没有被单词括起来的空格。

我当前的正则表达式如下所示:

( (?!\w)|(?<!\w) )

但它也匹配大括号外的字符。我试着环顾四周,但它并没有像我想象的那样真正发挥作用,我只是对正则表达式很烂..

我想从 css 类内容中删除所有空格,以便将字符串压缩为:

#sidebar h1 ul li{#a:hover;height:100px;color:#fffff;font-family:@fonts;}

顺便说一句,我使用的是 .NET Regex 引擎,所以如果有人需要一个快速测试环境,我发现这个 Silverlight 非常方便:http://www.regexlib.com/RESilverlight.aspx

【问题讨论】:

  • 您的 CSS 是否包含任何嵌套的括号对,例如 @media 部分?如果是这样,您将无法使用正则表达式执行此操作。

标签: regex


【解决方案1】:

鉴于某些 CSS 元素具有多字值 (border: 1px solid red),您描述的空格删除过程将是灾难性的。我建议您只删除以下位置的空格:

  • 在“{”之后
  • 在'}'之前
  • ';'之前和之后
  • ':'之前和之后

幸运的是,由于 CSS 的语法,这些模式都不会出现在 {...} 部分之外。不幸的是,我不知道 .NET 正则表达式引擎的细节,也许这会起作用:

( +(?=[};:])|(?<=[{;:]) +)

【讨论】:

    【解决方案2】:

    试试这个:

    Regex.Replace(str, @"(?:\B\s+|\s+\B)(?=[^{}]*\})", "")
    

    但如果@media 部分中有规则(即嵌套大括号),或者使用大括号作为元字符的语音规则,这可能会被愚弄。

    【讨论】:

    • 谢谢。这似乎可行,但由于我还想支持@media 部分,我将不得不研究没有正则表达式的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多