我只是想为脚本语言创建一些解释器,我现在遇到的一件事就是如何将两个字符长的char(带\
)解释为实际的char,
例如:您不能仅在单个字符中键入的内容:'\n'
为newline
,'\''
为'
等等。
我的解释器获取的信息是这样的字符串:"\\n"
因为"\"
在"n"
之前通过订单char读取后来自用户在编辑器中键入的文本的循环中的char
答案 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");