|
分類:[C#]
エスケープシークエンスの考え方が間違っています。
■No2201に返信(とおりすがりさんの記事) > [string abc = "C:\Program Files";]のように記述すると > 構文エラーが発生するため、 > [string abc = @"C:\ProgramFiles";]のように > エスケープシーケンス文字として読ませるよう記述すると思います。
逆です。文字列に"\"があった場合、 その直後の1文字とあわせて"エスケープシークエンス1文字"として解釈します。 (\n、\t、etc...) 文字列内で単純に文字"\"を使いたい場合、"\\"と記述する必要があります。 つまり "C:\Program Files"という文字列は "C:"という文字列、 "\P"というエスケープシークエンス、 "rogram Files"という文字列、 この3つでできていることになります。 \Pというエスケープシクエンスは存在していないため、 構文エラーが発生してしまいます。 ("\r"も"\n"も両方ともエスケープシークエンスのため構文エラーにはなりません)
@を文字列の前につけた場合には、 直後の文字列内の"\"を自動的に"\\"として扱うため、 @"C:\Program Files"という文字列は"C:\\Program Files"と等価になるわけです。
@"\"から"\"への変換処理ですが、 エスケープシークエンスは"\"+後ろの1文字という形をとるため、 "\\"の後ろの1文字を参照して対応したエスケープシークエンスに置き換える、 という動きになると思うので一筋縄ではいかないと思います。
単純に@"\〜"を"\〜"にReplaceメソッドにて置き換えてしまうのはどうでしょうか? お困りの件は @"\r"("\\r")を\r",@"\n"("\\n")を"\n"にReplaceしてあげれば実現できると思います。
|