0

C# 経由で入力を受け取ると、\. \\r文字列を解析しようとすると、文字列の代わりに使用しているため、エラーが発生し\rます。\エスケープしたり、文字列に変わったり\\するのを防ぐ方法はありますか\。私はもう試した:

protected string UnEscape(string s)
{
    if (s == "")
        return " ";
    return s.Replace(@"\\", @"\");
}

運がない。だから他の提案。

編集:

私が達成しようとしていることについて混乱しているように見える人もいるので、私は十分に具体的ではありませんでした. デバッグ"\\t"で文字列を読み込んでいましたが、"\t"出力したいからではなく\t、[タブ]を出力したいからです。上記のコードでは、Regex.Unescape(string) を介して既に行われたものを再作成しようとしていました。

4

3 に答える 3

1

問題は、バックスラッシュをエスケープしていることではなく、エスケープ シーケンスを文字に解析していないことです。文字とが入力され\rたときに文字を取得する代わりに、2 つの別個の文字として取得します。\\r

@"\\"二重のバックスラッシュがないため、文字列に変換することはできません@"\"。これは、デバッグ ツールを使用して文字列を表示する場合にのみ表示される方法です。これは実際には単一のバックスラッシュであり、\それ自体は文字ではないため、エスケープ シーケンスの一部にすることはできません。

変換する入力内のエスケープ シーケンスを対応する文字に置き換える必要があります。

s = s.Replace("\\r", "\r");

編集:

Servy が話している特殊なケースを処理するには、すべてのエスケープ シーケンスを一度に置き換えます。例:

s = Regex.Replace(s, @"\\([\\rntb])", m => {
  switch (m.Groups[1].Value) {
    case "r": return "\r";
    case "n": return "\n";
    case "t": return "\t";
    case "b": return "\b";
    default: return "\\";
  }
});
于 2013-10-25T16:15:53.217 に答える