【问题标题】:How to convert a two-character string @"\n" into actual char '\n'? [closed]如何将两个字符的字符串 @"\n" 转换为实际的 char '\n'? [关闭]
【发布时间】:2014-08-11 19:57:34
【问题描述】:

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

例如:不能在单个字符中键入的内容:'\n' 用于newline'\'' 用于' 等等..

我的解释器得到的信息是这样的字符串:"\\n",因为"\" 是在"n" 之前按照用户在编辑器中键入的文本循环中的字符顺序读取的。

【问题讨论】:

  • 你有代码要分享吗?我不确定你想要完成什么。
  • 在最初的问题中,你想解释'\n'而不是"\\n",你能不能在阅读反斜杠时不简单地用换行符代码替换它?
  • 是的,对不起,我在 "\\n" 和 @"\n" 之间有点困惑,忘记在标题中的字符串之前加上 at-sign @。非常感谢编辑。

标签: c# string char


【解决方案1】:

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

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

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

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

【讨论】:

  • @D.Diamond C# string literals 只接受少数\escapes
  • 更新了任何转义字符的解决方案
  • 试试\\\n 而不是\\n?甚至\\\\n,无论哪个有效。
  • 好的,我会检查 Regex Unescape 的东西,如果问题解决了,我会尽快更新并标记为答案。
  • 请注意,unescape 会尝试对所有内容进行转义,因此如果您只想对 \\ 字符进行转义,请先使用正则表达式匹配它们,然后遍历结果并替换为未转义的版本。
【解决方案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");

【讨论】:

  • 就是这样,Regex.Unescape
  • @Gusman 不,Regex.Unescape 相同 - Regex.Unescape 与 Regex.Escape 相反,但不等同于此代码或操作,如方法名称和答案的其余部分。特别是,Regex.Escape 将“反转”一些 not 在文字中有效的映射。
  • @D.Diamond 请先阅读文档。如果你能遵守这些规则,那就好了。
  • 来自 MSDN:“通过用它们的转义码替换它们。”,所以它会转义像 \n,\t... 这样的任何东西,所以如果 unescape 正好相反,那么它就是
  • @Gusman Regex.Escape(@"hello*world") 导致字符串值为hello\*world;但是,"hello\*world"invalid 文字。因此,虽然它确实“转义”了字符,但对于给定的上下文,它不恰当地这样做了。
猜你喜欢
  • 2012-11-16
  • 1970-01-01
  • 2018-07-24
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多