如何将两个字符的字符串@“\ n”转换为实际的字符'\ n'?

时间:2014-04-15 00:35:33

标签: c# string char

我只是想为脚本语言创建一些解释器,我现在遇到的一件事就是如何将两个字符长的char(带\)解释为实际的char,

例如:您不能仅在单个字符中键入的内容:'\n'newline'\'''等等。

我的解释器获取的信息是这样的字符串:"\\n"因为"\""n"之前通过订单char读取后来自用户在编辑器中键入的文本的循环中的char

2 个答案:

答案 0 :(得分:4)

据我所知,你的字符串中有“\ n”,最简单的方法是在处理它之前将“\\ n”替换为“\ n”。

string replaced = original.Replace("\\n", "\n");

如果您想要替换任何转义的字符,可以使用Regex.Unescape

请注意,unescape会试图解开所有问题,所以如果你只想看看“\\”。序列首先使用正则表达式匹配它们(类似“\\\\ [a-zA-Z0-9]”),然后遍历结果并替换为未转义的版本。

答案 1 :(得分:-2)

没有标准方法可以将字符串中的\n转义序列转换为单个字符'\n',就像解析string literals时一样。但是,制作一个简单的替换功能并不是非常困难。

例如,考虑以下骨架(它不处理\ U,\ u或\ x,但可以扩展):

string EscapeLikeALiteral (string src) {
    return Regex.Replace(src, @"\\(?<simple>['""\\0abfnrtv])", (m) => {
       var s = m.Groups["simple"].Value;
       switch (s) {
           case "'": return "'";
           case "\"": return "\"";
           case "0": return "\0";
           case "a": return "\a";
           case "b": return "\b";
           case "f": return "\f";
           case "n": return "\n";
           case "r": return "\r";
           case "t": return "\t";
           case "v": return "\v";
           default:
               throw new InvalidOperationException();
       }
    });
}

var r = EscapeLikeALiteral(@"hello\nworld");