我想解析一个保持对象图状态的自定义字符串格式。这是 ASP.NET 场景,我希望在客户端 (JavaScript) 和服务器 (C#) 上易于使用。
我有一个类似的格式
{Name1|Value1|Value2|...|ValueN}{Name2|Value1|...}{...}{NameN|...}
在这种格式中,我有 3 个分隔符,{
,}
和|
. 此外,因为这些字符在名称/值中是可以想象的,所以我使用非常常见的 定义了一个转义序列\
,这样\{
,\}
和\|
都被解释为它们自己的正常版本,当然\\
是反斜杠。都很标准。
最初我尝试使用正则表达式来尝试解析出具有类似 this 的对象的字符串表示(?<!\\)\{(.*?)(?<!\\)\}
。请记住\
,{
和}
都保留在正则表达式中。这当然将能够{category|foo\}|bar\{}
正确解析出类似的东西。但是我意识到它会失败,比如{category|foo|bar\\}
.
我只花了一分钟左右的时间来尝试这个(?<!(?<!\\)\\)\{(.*?)(?<!(?<!\\)\\)\}
并意识到这种方法是不可能的,因为您需要无限数量的负面回溯来处理潜在的无限数量的转义序列。当然,我不可能拥有超过一两个级别,因此我可能可以对其进行硬编码。但是,我觉得这是一个足够普遍的问题,它应该有一个明确的解决方案。
我的下一个方法是尝试编写一个已定义的解析器,在该解析器中我实际扫描输入缓冲区并以只进的方法使用每个字符。我实际上还没有完成这个,但它似乎过于复杂,我觉得我一定错过了一些明显的东西。我的意思是,只要我们有计算机语言,我们就有了解析器。
所以我的问题是用可能的转义序列解码这样的输入缓冲区的最简单、有效和优雅的方法是什么?