【发布时间】:2018-10-03 13:34:51
【问题描述】:
在我的应用程序的设置文件中,每一行都采用 name=value 的形式(例如:color=red)。名称由应用确定,而值是用户输入的文本。
由于文件格式每行需要一个设置,如果用户的值包含换行符(“\n”,ASCII 10),则会出现问题:这将使解析器崩溃(或允许他们插入假的 name =value 记录名称无效)。但是,我确实希望用户能够使用这个字符,所以我需要以某种方式对其进行转义:例如,s = s.Replace("\n", "\\n");
但是,用户也可以键入两个字符序列“\”+“n”。因此,假设我有任意讨厌的字符串,例如 "ABC\n\\n\\\\n\n\\\nXYZ" (它有两个换行符和两个文字 "\" + "n "其中的序列)。什么算法可以安全地 (i) 转义字符串,以确保它不包含换行符,然后 (ii) 反转该过程以恢复原始字符串?
【问题讨论】:
-
您是否考虑过不为这项工作编写自己的解析器,而是使用“已建立”的解析器和文件格式,如 json 或 XML?
-
要解析你需要遍历每个字符,当你看到一个 `\` 时,你设置一个标志,下一个字符被转义,然后相应地处理下一个字符并取消设置标志。但是最好找一个解析器来代替你处理。
-
如果你真的尝试过实现这种编码/解码,你会发现并不难。
-
听起来好像有问题的解析器不是为处理您设计的语法而设计的。与其试图规避这种对解析器规范的滥用,为什么不直接修改解析器呢?或者使用不同的解析器(+1 表示 Rand Random)? (对格式错误的用户定义输入的崩溃解析器听起来很可疑。)
-
我只是 javascript/json 编码字符串值。使用 JSON.NET,往返看起来像这样:
JsonConvert.DeserializeObject<string>(JsonConvert.SerializeObject("hello\n\n"))