我正在为 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 = @"[^ -237]";
public const String Escape = Unicode + @"\[^nrf0-9a-f]";
public const String Unicode = @"\[0-9a-f]{1,6}(rn|[ nrtf])?";
正则表达式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]|[^ -237]|\[0-9a-f]{1,6}(rn|[ nrtf])?\[^nrf0-9a-f][_a-z0-9-]|[^ -237]|\[0-9a-f]{1,6}(rn|[ nrtf])?\[^nrf0-9a-f]*
我的正则表达式与 CSS 规范中的表达式匹配(我认为),那么为什么它不匹配"foo"
?
更新:
根据leppi的建议,我添加了括号,结果如下:
public const String Ident= "[-]?(" + Nmstart + ")(" + Nmchar + ")*";
。但是它仍然不匹配。
问题解决方案有两个:
首先,Leppi 建议我将Nmstart
和Nmchar
宏分组是正确的。
其次,我需要使用 "G"
前缀而不是 "^"
前缀,因为我使用的是Match(String, Int32)
重载。