我正在使用PEG.js创建一个包含解析字符串的解析器
包含任何类型字符的字符串都用引号"
括起来,并且可能包含转义引号\"
。
到目前为止,我有以下规则:
start
= ["] string:(( '\\"' {return '"';} / [^"])*) ["]
{return string.join('');}
它适用于PEG.js Online Version,并为给定的输入"abc\"def"
生成"abc\"def"
。
为具有PEG.js版本0.7.0的Node.js版本0.6.21生成的解析器按以下方式执行
var result = parser.parse('"abc\"def"');
并产生以下错误:
{ name: 'SyntaxError',
expected: [],
found: 'd',
message: 'Expected end of input but "d" found.',
offset: 5,
line: 1,
column: 6 }
但是,使用\\"
代替\"
会使预期的输出成功。
var result = parser.parse('"abc\\"def"'); // parses correctly
这个问题有解释或解决方法吗? 特别是,我不可能在解析器的预期输入中双重转义所有引号。
答案 0 :(得分:4)
此声明中的字符串文字......
var result = parser.parse('"abc\"def"');
...实际上不包含反斜杠。在JavaScript中,这个符号序列 - \"
- 被解析为单个符号 - "
- 无论使用什么引号来分隔字符串 - 双重或单个字符串。 JS不会在字符串中插入变量和表达式,并且它们之间基本没有区别。
此字符串 - '"abc\\"def"'
- 但是有一个反斜杠:它由\\
序列编码。请注意,没有必要使用另一个反斜杠来转义双引号本身(因为分隔符是单引号)。但是,如果使用"\"abc\\\"def\""
形式,则必须这样做。