C# 如何转换两个字符的字符串\";转换为实际字符'\n';?

C# 如何转换两个字符的字符串\";转换为实际字符'\n';?,c#,string,char,C#,String,Char,我只是想为脚本语言创建一些解释器,我现在遇到的一件事是如何将两个字符长的字符(带有\)解释为实际的字符 例如:不能仅在单个字符中键入的内容:'\n'用于换行符,以及'\'用于'等等 我的解释器得到的信息是这样的字符串:“\\n”,因为“\”是在“n”之前从用户在编辑器中键入的文本循环中依次读取的。据我所知,字符串中有“\\n”,最简单的方法是将“\\n”替换为“\n”在处理它之前 string replaced = original.Replace("\\n", "\n"); 如果要替换任何转

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

例如:不能仅在单个字符中键入的内容:
'\n'
用于
换行符
,以及
'\'
用于
'
等等

我的解释器得到的信息是这样的字符串:
“\\n”
,因为
“\”
是在
“n”
之前从用户在编辑器中键入的文本循环中依次读取的。

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

string replaced = original.Replace("\\n", "\n");
如果要替换任何转义字符,可以使用


请注意,unescape会尝试对所有内容进行unescape,因此如果您只想对“\\.”序列进行unescape,请首先使用正则表达式来匹配它们(如“\\\[a-zA-Z0-9]”),然后遍历结果并替换为未转义版本。

没有标准方法可以将字符串中的转义序列(如
\n
)转换为单个字符
'\n'
,就像在解析过程中发生的那样。然而,制作一个简单的替换函数并不难

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

string escapeElikeAliteral(string src){
返回Regex.Replace(src,@“\\(?[”\\0abfnrtv]),(m)=>{
var s=m.Groups[“简单”].值;
开关{
案例“'”:返回“'”;
案例“\”:返回“\”;
案例“0”:返回“\0”;
案例“a”:返回“\a”;
案例“b”:返回“\b”;
案例“f”:返回“\f”;
案例“n”:返回“\n”;
案例“r”:返回“\r”;
案例“t”:返回“\t”;
案例“v”:返回“\v”;
违约:
抛出新的InvalidOperationException();
}
});
}
var r=EscapeLikeALiteral(@“hello\nworld”);

您有任何代码要共享吗?我不知道你想达到什么目的。在原来的问题中,你想解释
'\n'
而不是
“\\n”
,你能不能在每次读反斜杠时用换行字符代码替换它?是的,对不起,我自己对“\\n”和@”\n有点困惑忘了在标题的字符串前面加上@号。非常感谢编辑。@D.Diamond只接受少量的
\escape
。是否更新了任何转义字符的解决方案
\\\n
,而不是
\\n
?或者甚至
\\\\n
任何一个都可以。好的,我会检查Regex-Unescape的东西,如果问题解决了,我会很快更新并标记为答案。请注意,Unescape会尝试取消所有内容,因此如果您只想取消escape\\chars,请首先使用Regex匹配它们,然后遍历结果,并替换为未扫描的版本。Unescape@Gusman不,Regex.Unescape不相同-与Regex.Escape相反,但与方法名称和答案的其余部分所指示的代码或操作不同。特别是,Regex.Escape将“反转”一些在文本中无效的映射。@D.Diamond请先阅读文档。如果你能接受这些规则,那么就从MSDN开始:“通过用转义码替换它们来转义一组最小的字符(\,*,+,?,|,{,[,(,),^,$,,,#,和空格)”,所以它会转义类似于\n、\t的任何内容。所以如果unescape做的正好相反,那么它就在那里is@Gusman
Regex.Escape(@“hello*world”)
导致字符串值为
hello\*world
;但是,
“hello\*world”
是无效的文本。因此,虽然它对字符进行“转义”,但对于给定的上下文来说,这样做是不合适的。
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");