我正在学习如何使用peg.js编写解析器并遇到一个独特的问题。我使用;
作为分隔符来对键值对中的字符串进行分类。
示例:如果要解析的字符串是name=prabesh;city=Bangalore
。我的解析器目前将name
作为键,prabesh
作为值,city
作为键,bangalore
作为值。
问题是如果分隔符是字符串的一部分会怎么样?
例如:city=bangalore;address=#12/1;santacruz
你怎么解析它?
方法:搜索连续的;
即从首次=
搜索连续;
,然后将=
和最后;
之间的文字视为值。
这种方法的问题在于,如果值本身具有=
,那么解析器将无法正确解析它。
例如,此操作失败:token=crbz23;4=134;
有什么建议吗?
答案 0 :(得分:1)
使用PEG语法,您需要具体说明您不想匹配的内容。在您的示例中,如果遇到分号,则需要前瞻不匹配新密钥。解决此问题的常见PEG惯用法如下所示:(!(id) .)+
。以下是使用您输入的示例:
start =
exp+
exp =
key '=' val ';'?
key =
$([a-z]+)
val =
$((!(';' key '=') .)+)
输入:
city=bangalore;address=#12/1;santacruz
输出:
[
[
"city",
"=",
"bangalore",
";"
],
[
"address",
"=",
"#12/1;santacruz",
null
]
]