我正在使用正则表达式解析 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 个组合子。我想知道该捕获的组合器是什么。
组具有捕获列表,但捕获没有在该捕获中找到的组列表。有没有办法解决这个问题,或者我应该重新解析每个选择器?
Edit:每次捕获都会为您提供匹配发生位置的索引...也许我可以使用该信息来确定什么属于什么?
所以你不会认为我疯了,语法实际上非常简单,使用我的特殊 dict 类:
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", @""".*?(?<!\\)""|'.*?(?<!\\)'"},
};