web-dev-qa-db-ja.com

逐語的な文字列で「」をエスケープするにはどうすればよいですか?

私はc#に少し慣れていませんが、この時点で立ち往生しています。通常の文字列があり、\を使用して"をエスケープします。ここでエスケープするということは、コンパイラの解釈をエスケープすることを意味します。 "、および"を画面に出力すると、期待どおりの出力が得られます->

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

o/p->これは「通常の」文字列です

今、私は逐語的な文字列を持っています、そして私は上記と同じ方法で"を使用して\をエスケープしようとしています..-->

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();
    }
}

上記が機能しないのはなぜですか?

27

二重引用符を使用します。

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

二重引用符を含む逐語的な文字列を記述したい場合は、2つの二重引用符を記述する必要があります。

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

enter image description here

これは C#仕様のセクション2.4.4.5 でカバーされています:

2.4.4.5文字列リテラル

C#は、通常の文字列リテラルと逐語的な文字列リテラルの2つの形式の文字列リテラルをサポートしています。

通常の文字列リテラルは、「hello」のように二重引用符で囲まれた0個以上の文字で構成され、単純なエスケープシーケンス(タブ文字の場合は\ tなど)と16進数およびUnicodeのエスケープシーケンスの両方を含めることができます。

逐語的な文字列リテラルは、@文字とそれに続く二重引用符文字、0個以上の文字、および終了二重引用符文字で構成されます。簡単な例は@ "hello"です。逐語的な文字列リテラルでは、区切り文字の間の文字は逐語的に解釈されますが、唯一の例外は引用符-エスケープシーケンスです。特に、単純なエスケープシーケンス、16進数およびUnicodeのエスケープシーケンスは、逐語的な文字列リテラルでは処理されません。逐語的な文字列リテラルは複数行にまたがることがあります。

9
Soner Gönül

逐語的な文字列では、円記号はエスケープ文字ではなく標準文字として扱われます。エスケープが必要な唯一の文字は引用符です。これは、まったく同じ文字を使用してエスケープできます。

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

もちろん、このメソッドを使用して\t(タブ)のような特殊文字を追加することはできないため、単純な文字列にのみ役立ちます。これは、ファイルパスを操作する場合にのみ使用すると思います。

3
musefan