什么是CSS选择器的REGEX

Fre*_*her 17 css regex

我想在一个CSS文件中添加一个CSS文件并在每个CSS选择器之前添加另一个选择器.

从:

p{margin:0 0 10px;}
.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px;}
Run Code Online (Sandbox Code Playgroud)

我想要:

.mySelector p{margin:0 0 10px;}
.mySelector .lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px;}
Run Code Online (Sandbox Code Playgroud)

但是我的CSS文件非常复杂(事实上它是bootstrap css文件)所以正则表达式应该匹配所有的CSS选择器.

现在我有这个正则表达式:

([^\r\n,{};]+)(,|{)
Run Code Online (Sandbox Code Playgroud)

你可以在http://regexr.com?328ps看到结果 但是你可以看到有很多不匹配的比赛

例如:

text-shadow:0 -1px 0 rgba(0,
Run Code Online (Sandbox Code Playgroud)

匹配积极,但不应该

有人有解决方案吗?

谢谢

Dai*_*Dai 28

没有一个.CSS选择器不是" 常规语言 " 的示例,因此无法通过正则表达式进行解析.您需要根据CSS语法规范构建自己的解析器:http://www.w3.org/TR/css3-syntax/#detailed-grammar

CSS被描述为LL(1)语法,所以你可能最好使用像Yacc这样的工具来为你生成解析器.

  • 虽然答案在技术上是正确的(upvote!),OP可能不一定需要一个能够处理CSS规范的每个细微差别的解析器(正如你所说,它不是常规语言).可以编写一个正则表达式(或两个)来处理99%的真实CSS以满足OP的需求(如下所示). (7认同)
  • 语言不规则的事实并不总是意味着你不能用正则表达式解析它.原因是现代正则表达式实现现在具有更高级的功能,允许您深入研究稍微复杂的语言.例如,平衡匹配...... http://blogs.msdn.com/b/bclteam/archive/2005/03/15/396452.aspx (6认同)
  • +1在这类问题上看到正确答案是非常罕见的. (5认同)
  • 这是对不同问题的一个很好的答案.OP不需要CSS解析器.他/她只想在文本(CSS)文件中对CSS选择器执行查找和替换.没有必要过度思考问题. (5认同)

Fre*_*her 21

所以我终于找到了符合我要求的REGEX

([^\r\n,{}]+)(,(?=[^}]*{)|\s*{)
Run Code Online (Sandbox Code Playgroud)

关键是要添加一个积极的前瞻以避免不良匹配

(?=[^}]*{)
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到结果:http://regexr.com?328s7

我建议的唯一预防措施是删除每个块注释:


Fre*_*her 6

所以最后我找到了一种更好的方法来做到这一点.

我使用LESS编辑器(例如:http://lesstester.com/)

并简单地嵌套我的整个css文件:.mySelector {your css here}