JavaScript で正規表現を使用して初歩的なレクサーを作成していますが、1 つに結合したい 2 つの正規表現 (一重引用符で囲まれた文字列用と二重引用符で囲まれた文字列用) があります。これらは私の 2 つの正規表現です (テスト目的で文字^
と文字を追加しました)。$
var singleQuotedString = /^'(?:[^'\\]|\\'|\\\\|\\\/|\\b|\\f|\\n|\\r|\\t|\\u[0-9A-F]{4})*'$/gi;
var doubleQuotedString = /^"(?:[^"\\]|\\"|\\\\|\\\/|\\b|\\f|\\n|\\r|\\t|\\u[0-9A-F]{4})*"$/gi;
今、次のようにそれらを単一の正規表現に結合しようとしました:
var string = /^(["'])(?:[^\1\\]|\\\1|\\\\|\\\/|\\b|\\f|\\n|\\r|\\t|\\u[0-9A-F]{4})*\1$/gi;
ただし、入力をテストすると、代わりに次の"Hello"World!"
ように返されます。true
false
alert(string.test('"Hello"World!"')); //should return false as a double quoted string must escape double quote characters
問題は、[^\1\\]
グループに一致する以外の任意の文字\1
(一重引用符または二重引用符 - 文字列の区切り文字) と\\
(バックスラッシュ文字) に一致する必要があることだと考えました。
正規表現はバックスラッシュを正しく除外し、区切り記号に一致しますが、文字列内の区切り記号は除外しません。どんな助けでも大歓迎です。Crockford の鉄道図を参照して正規表現を記述したことに注意してください。