如何获取给定捕获的正则表达式组

本文关键字:正则表达式 何获取 获取 | 更新日期: 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 解析器吗?