0

我正在为 CSS 编写一个词法分析器/标记器,按照这个语法规范:http ://www.w3.org/TR/CSS21/syndata.html#syntax

我有一个正在尝试标记的示例样式表,在此处指定:

const String css = @"

foo bar {
    property: value;
    property2: value2;
    /* comment1 */
}
        ";

我的词法分析器在每次迭代中遍历每个正则表达式,它正确地捕获了初始空白标记,但是Ident正则表达式无法捕获"foo"文本。这是我的正则表达式:

public const String Ident    = "[-]?" + Nmstart + Nmchar + "*";
public const String Nmstart  = "[_a-z]|" + Nonascii + "|" + Escape;
public const String Nmchar   = @"[_a-z0-9-]|" + Nonascii + "|" + Escape;
public const String Nonascii = @"[^\0-\237]";
public const String Escape   = Unicode + @"\\[^\n\r\f0-9a-f]";
public const String Unicode  = @"\\[0-9a-f]{1,6}(\r\n|[ \n\r\t\f])?";

Ident则表达式扩展到此(转义):

[-]?[_a-z]|[^\\0-\\237]|\\\\[0-9a-f]{1,6}(\\r\\n|[ \\n\\r\\t\\f])?\\\\[^\\n\\r\\f0-9a-f][_a-z0-9-]|[^\\0-\\237]|\\\\[0-9a-f]{1,6}(\\r\\n|[ \\n\\r\\t\\f])?\\\\[^\\n\\r\\f0-9a-f]*

或者这个(未转义,逐字):

[-]?[_a-z]|[^\0-\237]|\\[0-9a-f]{1,6}(\r\n|[ \n\r\t\f])?\\[^\n\r\f0-9a-f][_a-z0-9-]|[^\0-\237]|\\[0-9a-f]{1,6}(\r\n|[ \n\r\t\f])?\\[^\n\r\f0-9a-f]*

我的正则表达式匹配 CSS 规范中的表达式(我认为),那为什么不匹配"foo"呢?

更新:

根据 leppi 的建议,我添加了括号,结果如下:

public const String Ident= "[-]?(" + Nmstart + ")(" + Nmchar + ")*";

...但是它仍然不匹配。

4

1 回答 1

0

问题的解决方案是双重的:

首先,Leppi 关于我对NmstartandNmchar宏进行分组的建议是正确的。

其次,我需要使用"\G"前缀而不是"^"前缀,因为我使用的是Match(String, Int32)重载。

于 2012-12-12T02:00:50.747 回答