簡體   English   中英

如何獲取給定Capture的Regex組?

[英]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組中的每個匹配,獲得相對於整個匹配的起始和結束索引,並查看每個組合子的索引是否在開始和結束索引范圍內。 如果組合子的索引落在該范圍內,它將出現在該選擇器中。

我不確定這在性能方面會如何。 但我認為你可以讓它發揮作用。

我不建議使用正則表達式來解析任何東西。 除了非常簡單的情況,解析器幾乎總是更好的選擇。 看看這個問題。

是否有C#的CSS解析器?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM