我有一个 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:我现在有代码可以完成我要求的操作,现在还想要更多!我想要的设置恰好是块中的最后一个设置 - 假设我想选择行高设置并通过类似的过程隔离它们 - 作为边距设置的替代方案?
答案1
回答
转到“代替“Notepad++ 的对话框(Ctrl+h)或菜单Search -> Replace...
,然后选择以下选项:
- 搜索模式,选择单选按钮“正则表达式“。
- 搜索模式, 选择 ”. 匹配换行符“
使用以下内容“寻找“:
(\.\w*)[[:blank:]]*\{.*?(margin:[\w[:blank:][:punct:]]*).*?\}
对于“用。。。来代替",使用类似这样的代码(只有 $1 和 $2 很重要):
$1 : $2
解释
将“查找”字符串分解成各个部分,从左到右,我们有:
(\.\w*)
:首先,我们需要找到块的名称。因此,以“。”(\.
)开头,后跟一些字母数字/下划线字符(\w*
)。将它们放在括号中可将它们放入一个组中,在本例中为第一组$1
。[[:blank:]]*\{.*?
:在块的名称之后,可能会有一些空格([[:blank:]]*
),后跟一个左花括号(\{
- 用“\”转义,因为括号在正则表达式中有特殊含义)。最后,我们匹配任何内容(.*
),包括换行符,但尽可能少(因此?
),以使块内的所有内容都包含到下一部分(即“边距”)。请注意,这部分没有分组,因为我们实际上是将其丢弃。(margin:[\w[:blank:][:punct:]]*)
:下一个值得关注的部分是“边距”及其值。因此,这被分组,并将成为$2
。首先,我们逐字匹配margin:
,然后匹配其值,该值将是一串字母数字/下划线、标点符号和空格(但不是换行符)。之所以使用复杂[\w[:blank:][:punct:]]*
而不是类似的东西.*?
,是因为 a.
会匹配任何字符,包括换行符和可能存在的边距线之后的任何字符,直到结束花括号。.*?\}
:最后,我们匹配块中剩余的所有内容(在本例中,它只是“margin”行末尾的新行)和结束花括号。同样,将其丢弃。