我有一个CSS样式表,我想对它进行一些分析,在Notepad ++中使用正则表达式似乎是个好主意。现在,我发现我无法编写正则表达式,也许这不是一个好主意,但不管是不是好主意,我都想知道如何去做。
我有一组自动生成的样式,标记为(大部分)block_1至block_149。我首先要做的是仅提取有关每种样式指定哪些边距设置的信息,因为这似乎是主要区别之一。有些是合理的,尤其是标题等的早期版本,但后来的版本似乎反映了原始Word文档的复杂计算。您可以在下面的示例中看到两者:
[注意:我在每行的末尾添加了2个空格,以使其在此处正确显示-这些空格在原始代码中不存在。但是,原始代码(从Sigil导入)在每行的开头确实有额外的间隔-我不确定这是空格还是制表符-我一直在尝试使用空格指示符来覆盖所有选项。]
.block_8 {
background-color: #FFF;
display: block;
font-family: "Calibri", sans-serif;
font-size: 1.125em;
font-weight: bold;
line-height: 1.2;
page-break-after: avoid;
text-align: center;
padding: 0;
margin: 0 2.25pt 0 0
}
.block_9 {
border-bottom: 0;
border-top: 0;
display: block;
line-height: 1.2;
text-indent: 1.5em;
padding: 0;
margin: 0.3em 0
}
.block_10 {
background-color: #FFF;
border-bottom: 0;
border-top: 0;
display: block;
font-family: serif;
font-size: 0.75em;
line-height: 12.2pt;
text-indent: 1.5em;
padding: 0;
margin: 0.3em 0
}
...
.block_113 {
background-color: #FFF;
border-bottom: 0;
border-top: 0;
display: block;
letter-spacing: -0.1pt;
line-height: 1.2;
text-indent: 1.5em;
padding: 0;
margin: 0.3em 0 0.3em 16.1pt
}
.block_114 {
background-color: #FFF;
border-bottom: 0;
border-top: 0;
display: block;
font-family: serif;
font-size: 0.75em;
text-indent: 1.5em;
padding: 0;
margin: 0.3em 0.5pt 0.3em 0.7pt
}
还有其他差异,即使是后面的差异,仅对于正文而言,条目的数量也不同。
我想做的是有一个正则表达式,我可以在第一个实例中使用它来将每个条目减少为:Block_(number)margin:(settings)
我曾想过提取不同的边距设置(T,R,B,L),但是由于源可以包含1,2,3或4个设置,因此用正则表达式整理这些规则超出了我的野心。我一直在使用regex101.com尝试仅使用边距设置从非常简单的识别扩展,但是设法在块号和边距设置之间包括所有(可变数量的)额外的行令我很困惑。理想情况下,我希望以后可以使用类似的正则表达式技术来提取其他设置。我还希望能够处理布局中可变数量的空格和/或制表符。
谁能告诉我该怎么做?到了几乎可以肯定地可以更快地进行基本剪切和粘贴的阶段,但是现在我想知道如何针对可能需要用于另一个项目的时间进行正则表达式。
EtA:我现在有可以满足我要求的代码,现在还需要更多!我想刚好是块中的最后一个设置-假设我想选择行高设置并通过类似的过程将其隔离-作为边距设置的替代选择?
转到Notepad ++(Ctrl + h)或菜单的“替换”对话框Search -> Replace...
,然后选择以下选项:
将以下内容用于“查找”:
(\.\w*)[[:blank:]]*\{.*?(margin:[\w[:blank:][:punct:]]*).*?\}
对于“用”替换,请使用类似以下的东西(仅$ 1和$ 2是重要的):
$1 : $2
从左到右将Find字符串分解成其组成部分,我们有:
(\.\w*)
:首先,我们需要找到块的名称。因此,从字面上开始是“。” (\.
),后跟一些字母数字/下划线字符(\w*
)。将它们放在括号中会使它们成为一个组,在本例中为第一组$1
。
[[:blank:]]*\{.*?
:在块的名称之后,可能会有一些空格([[:blank:]]*
),后跟一个大括号(\{
-用“ \”转义,因为括号在正则表达式中具有特殊含义)。最后,我们匹配ANYTHING(.*
),包括新行,但要尽可能少(因此?
),以使块中的所有内容都到达下一部分(即“ margin”)。请注意,由于我们正在有效地将其丢弃,因此没有任何部分被分组。
(margin:[\w[:blank:][:punct:]]*)
:下一个感兴趣的部分是“保证金”及其价值。因此,将其分组,并将变为$2
。首先,我们从字面上匹配margin:
,然后是它的值,该值将是一串字母数字/下划线,标点符号和空格(但不能是新行,如字符)。之所以比较复杂,是因为与a之[\w[:blank:][:punct:]]*
类的东西相反.*?
,是因为a.
会匹配任何字符,包括换行符和可能存在的空白行之后的任何字符,直到右花括号为止。
.*?\}
:最后,我们匹配块中剩余的所有内容(在这种情况下,它只是“ margin”行末尾的新行)和右花括号。再次,被丢弃。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句