[英]How can I get the Regex Groups for a given Capture?
我正在使用正則表達式解析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個組合器。 我想知道該組合器對於該捕獲是什么。
組具有Captures列表,但Captures沒有在Capture中找到的組列表。 有沒有解決方法,或者我應該重新解析每個選擇器?
編輯:每次捕獲確實為您提供了匹配發生位置的索引...也許我可以使用該信息來確定屬於什么?
所以你不認為我瘋了,語法實際上非常簡單,使用我的特殊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", @""".*?(?<!\\)""|'.*?(?<!\\)'"},
};
你不應該寫一個正則表達式來解析整個事情。 但首先得到選擇器,然后為每個選擇器獲得組合器。 (至少你可以解析你的例子,真正的CSS會變得更復雜。)
每次捕獲確實為您提供了匹配發生位置的索引...也許我可以使用該信息來確定屬於什么?
只是在這里大聲思考; 你可以選擇Selector
組中的每個匹配,獲得相對於整個匹配的起始和結束索引,並查看每個組合子的索引是否在開始和結束索引范圍內。 如果組合子的索引落在該范圍內,它將出現在該選擇器中。
我不確定這在性能方面會如何。 但我認為你可以讓它發揮作用。
我不建議使用正則表達式來解析任何東西。 除了非常簡單的情況,解析器幾乎總是更好的選擇。 看看這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.