我想解析一个持久化对象图状态的自定义字符串格式.这是ASP.NET场景,我想在客户端(JavaScript)和服务器(C#)上使用易于使用的东西.
我有一个类似的格式
{Name1|Value1|Value2|...|ValueN}{Name2|Value1|...}{...}{NameN|...}
在这种格式我有3个分隔符{
,}
和|
.此外,因为在名称/值中可以想到这些字符,所以我使用非常常见的方式定义了一个转义序列\
,这样\{
,\}
并且\|
都被解释为它们自身的正常版本,当然\\
也是反斜杠.一切都很标准.
最初我试图使用正则表达式来尝试用这样的东西解析出对象的字符串表示(?.请记住
\
,{
并且}
都在正则表达式中保留.这当然能够解析出{category|foo\}|bar\{}
正确的东西.但是我意识到它会失败{category|foo|bar\\}
.
我只花了一分钟时间尝试这个,(?并意识到这种方法是不可能的,因为你需要无数个负面的后观来处理潜在的无限数量的转义序列.当然,我不可能有超过一个或两个级别,所以我可能会硬编码.但是,我觉得这是一个很常见的问题,应该有一个定义明确的解决方案.
我的下一个方法是尝试编写一个定义的解析器,其中我实际上扫描了输入缓冲区并在前向方法中使用了每个字符.我还没有真正完成这个,但它似乎过于复杂,我觉得我必须遗漏一些明显的东西.我的意思是只要我们有计算机语言,我们就有解析器.
所以我的问题是,使用可能的转义序列解码这样的输入缓冲区的最简单,有效和优雅的方法是什么?
(?
(?
\
在此之前会阻止任何事情.
(?:\\\\)*
将允许任何数量的转义\
.
\{
匹配一个左大括号.
(
开始一个捕获组.
.*?
匹配内容,包括任何内容|
.
(?
\
在此之前会阻止任何事情.
(?:\\\\)*
将允许任何数量的转义\
.
)
结束捕获组.
\}
匹配一个右大括号.