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

問題の解決策は次の 2 つでした。

Nmstartまず、とNmcharマクロをグループ化するという Leppi の提案は正しかった。

次に、オーバーロードを使用していたため、"\G"プレフィックスの代わりにプレフィックスを使用する必要がありました。"^"Match(String, Int32)

于 2012-12-12T02:00:50.747 に答える