编写基于正则表达式的词法分析器 - 正则表达式与输入不匹配



我正在为 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 建议我将NmstartNmchar宏分组是正确的。

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

最新更新