C#では通常の文字列リテラルのほかに、逐語的文字列リテラルで文字列リテラルを記述することができます。 @" "
のように文字列リテラルの二重引用符の前にアットマーク@
を前置することで逐語的文字列リテラルはとなり、逐語的文字列リテラル内では\n
や\\
などのエスケープシーケンスは無効化され、そのまま文字列化されます。
逐語的文字列リテラルを用いることにより、ファイルパスや正規表現などバックスラッシュ\
を多用する文字列を見やすく記述することができます。 逐語的文字列リテラル内ではエスケープシーケンスは無効化されるため、二重引用符を記述する場合は""
のように二つ重ねて記述します。
逐語的文字列リテラルを使って文字列を記述する
using System;
using System.Text.RegularExpressions;
class Sample {
static void Main()
{
// 通常の文字列リテラルと逐語的文字列リテラルの例
var s1 = "abc\n\"def\"\x67\x68\x69";
var s2 = @"abc\n""def""\x67\x68\x69";
Console.WriteLine(s1);
Console.WriteLine(s2);
Console.WriteLine();
// 通常の文字列リテラルと逐語的文字列リテラルでファイルパスを記述する例
var path1 = "C:\\Windows\\Microsoft.NET\\Framework";
var path2 = @"C:\Windows\Microsoft.NET\Framework";
Console.WriteLine(path1);
Console.WriteLine(path2);
Console.WriteLine();
// 通常の文字列リテラルと逐語的文字列リテラルで正規表現を記述する例
var regex1 = new Regex("\\d{1,3}(\\.\\d{1,3}){3}(/\\d{1,2})?");
var regex2 = new Regex(@"\d{1,3}(\.\d{1,3}){3}(/\d{1,2})?");
Console.WriteLine(regex1);
Console.WriteLine(regex2);
Console.WriteLine();
}
}
実行結果
abc "def"ghi abc\n"def"\x67\x68\x69 C:\Windows\Microsoft.NET\Framework C:\Windows\Microsoft.NET\Framework \d{1,3}(\.\d{1,3}){3}(/\d{1,2})? \d{1,3}(\.\d{1,3}){3}(/\d{1,2})?
正規表現要素をエスケープした文字列で表現する、あるいはエスケープされている文字列から正規表現要素に変換するメソッドとして、Regex.Escape/Regex.Unescapeメソッドが用意されています。
PerlやJavaScript等の言語では/\d+/
や/\.txt$/
といった正規表現リテラルがサポートされていますが、C#およびVBでは正規表現リテラルは用意されておらず使用することはできません。 このような文字列をコード中に記述しても正規表現とは解釈されず、また正しくコンパイルされません。 正規表現を扱う方法については正規表現によるパターンマッチングと文字列操作を参照してください。