如何将由两个字符组成的字符串@"\n"转换为实际的字符'\n'?

3
我只是试图为一个脚本语言创建一些解释器,现在遇到的问题之一是如何将两个字符长的字符(带有\)解释为实际字符。
例如:在单个字符中无法键入的内容:'\n'表示换行符,'\''表示 ' 等等。
我的解释器获取的信息是这样的字符串:"\\n",因为在从用户在编辑器中输入的文本中以一个字符接一个字符的顺序循环时,会先读取"\",然后才是"n"

2
你有任何代码可以分享吗?我不确定你想要实现什么。 - Jeremy West
在原始问题中,您想要解释'\n'而不是 "\\ n",您不能在读取反斜杠时将其直接替换为换行符代码吗? - Couchy
是的,抱歉,我自己有点混淆了“\n”和“@ \n”,并忘记在标题字符串前加上at符号@。非常感谢编辑们。 - David von Tamar
2个回答

4

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

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

如果您想替换任何转义字符,可以使用Regex.Unescape
请注意,unescape将尝试取消转义所有内容,因此如果您只想取消转义“\\.”序列,请先使用正则表达式匹配它们(例如“\\\\[a-zA-Z0-9]”),然后遍历结果并用未转义版本替换。

1
@D.Diamond C#字符串字面量只接受少量的\转义字符 - user2864740
好的,我会检查正则表达式反转义的问题,如果问题得到解决,我会尽快更新并标记为答案。 - David von Tamar
这个东西起作用了。谢谢。不仅仅是 \,而是所有以 \ 开头的字符,所以它完全符合我的需求。这是一个可靠的解决方案。 - David von Tamar
我的意思是它将转义 \、*、+、?、|、{、[、(、)、^、$、.、#,因此应使用类似于“\\[a-zA-Z]”的正则表达式仅匹配'\'转义字符。 - Gusman
Regex.Escape在这种情况下是可疑的。原因如下:Regex.Escape(@“hello*world”)的结果是字符串值hello\*world;然而,“hello\*world”是无效的文字。因此,虽然它确实“转义”了字符,但对于给定的上下文来说,它不合适。 - user2864740
显示剩余4条评论

-2

将字符串中的转义序列(例如\n)转换为单个字符'\n'的标准方法不存在,就像在字符串字面量解析期间发生的那样。但是,制作一个简单的替换函数并不是非常困难。

例如,考虑以下框架(它不处理\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");

这就是它,Regex.Unescape。 - Gusman
@Gusman 不,Regex.Unescape不是相同的 - Regex.Unescape 是Regex.Escape的相反,但与此代码或操作不等效,正如方法名称和答案的其余部分所示。特别是,Regex.Escape将“反转”某些在文字中无效的映射。 - user2864740
是的,这是正确的。那又怎样?正如我在评论中所述,它可以转义更多的内容,但它可以转义/取消转义任何带有'.'或"\."的内容,这也是他要求的。 - Gusman
@Gusman 在上下文中,“There it is,Regex.Unescape”这个语句是错误的。我提供了一个工作的最小框架,可以将字符串转义为C#字符串文字(减去\U、\u和\x形式)。 - user2864740
哈哈,愤怒地点了个踩,接受你错了的事实吧,小子。 - Gusman
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接