然而,解析CSS类会忽略@media查询

时间:2014-04-03 13:54:24

标签: c# css regex

我有一个用C#编写的CSS解析器实用程序。我能够使用以下正则表达式解析和提取所有CSS类。这是按预期工作的。

[C#]

const string expression = "(.*?)\\{(.*?)\\}";
var regEx = new Regex(expression, RegexOptions.Singleline | RegexOptions.IgnoreCase);
var matches = regEx.Matches(styleSheet);

[CSS]

body 
{
    font-family: Helvetica Neue,Helvetica,Arial,sans-serif;
    font-size: 13px;
    color: #666666;
}

img 
{
    border: 0;
    display: block;
}

@media only screen and (max-width: 600px)
{
    table[class=bodyTable] 
    {
        width: 100% !important;
    }

    table[class=headerlinks]
    {
        display:none !important;
    }
}

a 
{
    text-decoration: none;
}

但是现在我们的软件已开始支持媒体查询,出于某种原因,我们希望在CSS解析期间忽略整个媒体查询。所以它应该只匹配body,img和a。

感谢有人可以帮我写新的正则表达式:)

[解决方法] 一旦我得到所有匹配项,在我的代码中我必须使用foreach进行一些处理 -

foreach(Match match in matches)
{
    var selectorString = match.Groups[1].ToString();

    if (selectorString.IndexOf("@media", StringComparison.InvariantCulture) > -1)
        continue;

    // processing...
}

1 个答案:

答案 0 :(得分:0)

通过使用负面观察,我们获得了更优雅的解决方案。我写了一些表格:

((?:(?<!@media).)*?){(.*?)}

或者,扩展:

(                // start 1st group
  (?:            // start non-capturing group (complex expression)
    (?<!@media)  // match if not preceded by @media
    .            // now match any character
  )*?            // any number of times
)                // end of 1st group
{                // match literal {
(                // start 2nd group
  .              // any character
  *?             // any number of times
)                // end of 2nd group
}                // match literal }

查看https://www.debuggex.com/r/QgjgoymphZ1Ska25

注意:随意根据需要添加转义...