この構文仕様に従って、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 + ")*";
...しかし、それでも一致しません。