Skip to main content
 首页 » 编程设计

c#之具有重叠匹配的多行正则表达式

2024年01月29日24zengkefu

我正在开发一种工具,可以为 CSS 样式声明解析文件。它使用了一个非常复杂的正则表达式,除了预期的性能问题和一些目前没有影响我的小错误之外,它正在做我想做的所有事情,除了一件事。

我让它匹配元素名称、类、子类、伪类等的所有组合。但是,当一行包含多个声明时,我只能让它匹配一次。例如,这是目前让我感到困惑的事情:

td.class1, td.class2, td.class3 
{ 
    background-color: #FAFAFA; 
    height: 10px; 
} 

我可以写一个表达式来满足这三个声明的所有要求,但是因为我也在它之后捕获信息(括号内的实际样式信息)我觉得这整个文本 block 都被认为是被考虑在内的因此,引擎会继续处理刚刚处理的整个 block 之后的下一个字符。

有没有一种方法可以做到这一点,每个类都是一个单独的匹配项,并且所有类都将包含随后的样式信息?我知道我可以修改我的正则表达式以匹配整行,然后在获得匹配后将其解析为逗号,但如果可能的话,我想将所有逻辑保留在表达式本身中。

如果表达式和/或我用来生成它的注释代码与答案绝对相关,我可以发布它,但是表达式很大/很丑(就像所有非平凡的正则表达式一样)并且代码有点冗长.

请您参考如下方法:

这是一个适用于您的样本数据的正则表达式:

@"([^,{}\s]+(?:\s+[^,{}\s]+)*)(?=[^{}]*(\{[^{}]+\}))" 

第一部分匹配并捕获第 1 组中的选择器 (td.class1),然后先行跳过任何剩余的选择器并捕获第 2 组中的关联样式规则。下一次匹配尝试从前瞻开始的位置开始,因此它匹配下一个选择器 (td.class2),并且前瞻再次捕获相同的规则 block 。

这不会处理 @-rules 或评论,但它可以很好地处理您提供的样本数据。我什至在一些真实世界的样式表上检查过它,它表现得非常好。