如何获取给定捕获的正则表达式组
本文关键字:正则表达式 何获取 获取 | 更新日期: 2023-09-27 17:56:01
我正在使用正则表达式解析CSS3选择器。例如,选择器a>b,c+d
分解为:
Selector:
a>b
c+d
SOSS:
a
b
c
d
TypeSelector:
a
b
c
d
Identifier:
a
b
c
d
Combinator:
>
+
问题是,例如,我不知道>
组合器属于哪个选择器。Selector
组有 2 个捕获(如上所示),每个捕获包含 1 个组合器。我想知道用于捕获的组合器是什么。
,但捕获没有在该捕获中找到的组列表。有没有办法解决这个问题,或者我应该重新解析每个选择器?
编辑:每次捕获都会为您提供比赛发生地点的索引......也许我可以使用这些信息来确定什么属于什么?
所以你不认为我疯了,语法其实很简单,使用我的特殊字典类:
var flex = new FlexDict
{
{"GOS"/*Group of Selectors*/, @"^'s*{Selector}('s*,'s*{Selector})*'s*$"},
{"Selector", @"{SOSS}('s*{Combinator}'s*{SOSS})*{PseudoElement}?"},
{"SOSS"/*Sequence of Simple Selectors*/, @"({TypeSelector}|{UniversalSelector}){SimpleSelector}*|{SimpleSelector}+"},
{"SimpleSelector", @"{AttributeSelector}|{ClassSelector}|{IDSelector}|{PseudoSelector}"},
{"TypeSelector", @"{Identifier}"},
{"UniversalSelector", @"'*"},
{"AttributeSelector", @"'['s*{Identifier}('s*{ComparisonOperator}'s*{AttributeValue})?'s*']"},
{"ClassSelector", @"'.{Identifier}"},
{"IDSelector", @"#{Identifier}"},
{"PseudoSelector", @":{Identifier}{PseudoArgs}?"},
{"PseudoElement", @"::{Identifier}"},
{"PseudoArgs", @"'([^)]*')"},
{"ComparisonOperator", @"[~^$*|]?="},
{"Combinator", @"[ >+~]"},
{"Identifier", @"-?[a-zA-Z'u00A0-'uFFFF_][a-zA-Z'u00A0-'uFFFF_0-9-]*"},
{"AttributeValue", @"{Identifier}|{String}"},
{"String", @""".*?(?<!'')""|'.*?(?<!'')'"},
};
你不应该写一个正则表达式来解析整个事情。但是首先获取选择器,然后获取每个选择器的组合器。(至少这是你解析示例的方式,真正的CSS会更复杂。
不过,每次捕获都会为您提供匹配发生位置的索引......也许我可以使用这些信息来确定什么属于什么?
在这里大声思考;你可以挑选出Selector
组中的每个匹配项,获取其相对于整个匹配项的起始和结束索引,并查看每个组合器的索引是否在开始和结束索引范围内。如果运算器的索引落在该范围内,则它出现在该选择器中。
不过,我不确定这在性能方面会如何。但我认为你可以让它发挥作用。
我不建议使用正则表达式来解析任何东西。除了非常简单的情况,解析器几乎总是更好的选择。看看这个问题。
有适用于 C# 的 CSS 解析器吗?