如何在保留字符串中转义引号?

56

我对C#还不太熟悉,目前遇到了问题。我有一个普通的字符串,在其中使用了\来转义"。这里的转义意味着要避免编译器将"解释为代码,而是在屏幕上打印出"。我得到了预期的输出-->

class Program
{
    static void Main(string[] args)
    {
        string s1 = "This is a \"regular\" string";
        System.Console.WriteLine(s1);
        System.Console.Read();
    }
}

输出--> 这是一个“常规”字符串

现在,我有一个逐字字符串,并且我正在尝试以与上述相同的方式使用 \ 转义 "..-->

class Program
{
    static void Main(string[] args)
    {
        string s2 = @"This is \t a \"verbatim\" string";//this would escape \t
        System.Console.WriteLine(s2);
        System.Console.Read();
    }
}

为什么上述代码无法正常工作?

3个回答

73

使用双引号:

 string s2 = @"This is \t a ""verbatim"" string";

使用 C# 11,您也可以使用原始字符串字面量,例如:

string longMessage = """
    This is a long message.
    It has several lines.
        Some are indented
                more than others.
    Some should start at the first column.
    Some have "quoted text" in them.
    """;

原始字符串字面值是一种新的字符串字面值格式。原始字符串字面值可以包含任意文本,包括空格、换行、嵌入式引号和其他特殊字符,而无需使用转义序列。原始字符串字面值以至少三个双引号(""")字符开头。它以相同数量的双引号字符结尾。


28
技术上来说,这是一个“双引号内再加一对双引号”的引用方式 :) - Matthew Watson
5
@MatthewWatson,你的评论被三重引用了。 - Fabio Marcolini
是的,现在它运行良好。谢谢你的信息。 - Srinivas Cheruku
@matthewwatson 一个双引号,肯定是两个吧? :) - Caius Jard

18

如果你想写一个包含双引号的原样字符串,你必须写两个双引号。

string s2 = @"This is \t a ""verbatim"" string";

此处涉及到 C# 规范的第 2.4.4.5 节:String literals 字符串字面值

2.4.4.5 字符串字面值

C# 支持两种形式的字符串字面值:普通字符串字面值和逐字字符串字面值。

普通字符串字面值由双引号括起来的零个或多个字符组成,例如 "hello",可以包含简单转义序列(如 \t 表示制表符)以及十六进制和 Unicode 转义序列。

逐字字符串字面值由 @ 字符、紧随其后的双引号、零个或多个字符和一个终止双引号组成。例如 @"hello"。在逐字字符串字面值中,定界符之间的字符会被按照字面量解释,唯一的例外是引号转义序列。特别地,在逐字字符串字面值中不处理简单转义序列和十六进制和 Unicode 转义序列。逐字字符串字面值可跨越多行。


4
在Verbatim字符串中,反斜杠被视为标准字符而非转义字符。需要转义的唯一字符是引号,可以使用相同的字符进行转义:
string s2 = @"This is \t a ""verbatim"" string";

当然,使用这种方法无法添加像\t(制表符)这样的特殊字符,因此它只对简单字符串有用 - 我认为我仅在处理文件路径时使用此方法。

你可以添加制表符-按制表键。换行也是一样(它会插入\r\n),但其他控制字符可能会更困难。可以从字符映射中复制粘贴。 - Gusdor
对于文件路径,C# 中的 Path.DirectorySeparatorChar() 方法更好一些。 - sergiol
2
@sergiol:确实,说实话,我也不太用它们来构建文件路径。如果我正在构建一个文件路径,我会使用 Path.Combine() 代替。 - musefan

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