【问题标题】:Escaping newlines in the presence of literal "\" + "n"在存在文字“\”+“n”的情况下转义换行符
【发布时间】: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"))

标签: c# escaping newline


【解决方案1】:

如果你只想处理'\n',下面的方法可以工作:

string Parse(string input)
{
    return input.Replace("\\","\\\\").Replace("\n","\\n");
}

string ParseBack(string input)
{
    string output="";
    for(int i=0; i < input.Length; i++)
    {
        if(input[i]=='\\')
        {
            i++;
            if(input[i]=='n')
            {
                output += '\n';
            }
            else 
            {
                output += input[i];
            }
        }
        else
        {
            output += input[i];
        }
    }
    return output;
}

输入:

ABC 
\n\\n 
\ 
XYZ

已解析:

ABC\n\\n\\\\n\n\\\nXYZ

解析返回:

ABC 
\n\\n 
\ 
XYZ

【讨论】:

  • ParseBack 吞下独立的反斜杠。
  • @500-InternalServerError 独立反斜杠将被解析为双反斜杠,该双反斜杠将被解析为独立反斜杠。
【解决方案2】:

首先,您可以使用@"string",它将停止转义序列

所以基本上,@"\n" 会变成 \n 而不是换行符

对于用户值中的换行符,我也遇到了这个问题,我通过用用户永远不会输入的内容(例如&lt;|NewLine|&gt;)替换换行符(\n)来解决它。当我从文件中写入或读取时,我会替换相应的值

用其他东西替换 newline-char 不是最好的解决方案,但我喜欢使用它,因为它对我来说相当简单

【讨论】:

  • OP 的字符串可能不是来自编译时文字。
  • @500-InternalServerError 100% not compile-time literals since OP said The names are determined by the app, whereas the values are text typed by the user.
猜你喜欢
  • 2012-03-06
  • 2020-07-26
  • 2021-01-20
  • 2018-02-09
  • 2021-08-10
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多