【发布时间】:2017-06-14 01:19:09
【问题描述】:
我有一种感觉,我正在尝试做的事情真的很容易,但我现在已经坚持了一段时间,所以非常感谢你的一点帮助,这是我得到的一个例子:
.selector, .selector2 {
color: #fff;
background: #f4c13b;
opacity: 1;
}
.selector3:hover {
color: red;
opacity: 0;
background: #f4c13b;
}
#selector4.class {
background: #f4c13b;
color: red;
}
@media (min-width:320px) {
selector5 {
opacity: 1;
background: #f4c13b;
}
}
现在,我想匹配每个具有 background: #f4c13b; 的选择器,因此捕获组将返回:.selector, .selector2 和 .selector3:hover 和 #selector4.class 和 selector5。
这是我目前得到的:/(.*) {[\S\s][^background]*background: #f4c13b;/gm
不幸的是,它只匹配将background: #f4c13b; 作为第一个属性的选择器,因此如果在{ 和background: #f4c13b; 之前有某些内容,它将不匹配:(
这是这背后的基本思想,每个选择器都在新行上,所以我想匹配并捕获{之前的所有内容,然后选择background: #f4c13b;之前的所有内容,然后选择}之前的所有内容,这样我就可以从第一个捕获组中提取选择器。
我正在使用 regexr.com 来测试表达式,我猜他们正在使用 JavaScript 风格的 RegEx。非常感谢您的帮助和解释,谢谢!
【问题讨论】:
-
您是否需要专门使用正则表达式的解决方案?你的用例是什么?我认为完全解析 CSS 可能更容易,使用可以理解 CSS3 选择器甚至压缩 CSS 的东西,然后遍历所有选择器……
-
我认为您需要告诉我们您使用的是哪种语言。在 Java(甚至 JavaScript)中,您会重复匹配一个模式并将选择器提取到某种数据结构中。
-
顺便说一句,
[^background]并不意味着匹配除background之外的任何字符串。相反,它表示匹配除b,a,c,k,g,r,o,u,n,d之外的任何单个字符。 -
它不一定是 RegEx,我提出它是因为它是我所知道的唯一可以完成这项工作的工具。我正在使用 regexr.com 来提取 List 面板中的选择器,在该面板中输入
$1,,这就是我获取所有选择器的方式,然后我将它们复制并粘贴到我需要的地方。感谢您的快速回复,非常感谢! -
您可以尝试使用这个:
(.*)? {.*?background: #f4c13b;...如果您使用的是 Notepad++ 之类的工具,您可以继续使用它。
标签: javascript regex regex-negation regex-lookarounds regex-greedy