我正在为 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 + ")*";
...但是它仍然不匹配。