web-dev-qa-db-ja.com

C#の文字列で「\\」を「\」に置き換えます

まだこれを行う方法がわかりません。これに関する多くの投稿を見ましたが、解決策はありませんでした。

「a \\ b」という文字列があります。必要な結果は「a\b」です。これはどのように行われますか?

Server\DbInstanceというインスタンスを指すデータベース接続文字列を持つテキストファイルがあります

私の目的は、テキストファイルで文字列の置換を行うことです。 "Server\DbInstance"を別の値、たとえば "10.11.12.13、1200"に置き換えます。

ので、私は持っています:

stringToBeReplaced = @"Server\DbInstance";
newString = @"10.11.12.13, 1200";

これが問題の始まりです。 stringToBeReplacedは常に「Server \\ DbInstance」になります。テキストファイルでこの文字列を検索すると、テキストファイルに「Server \\ DbInstance」という文字列がないため、検索に失敗します。代わりに、「Server\DbInstance」のみがあります。では、「Server \\ DbInstance」を「Server\DbInstance」に変更するにはどうすればよいですか?

36
Sandeep

私はあなたの文字列をすでに疑っています実際には単一のバックスラッシュしか含まれていませんが、デバッガでそれを見て、C#の通常の文字列リテラルとして有効な形式にエスケープしています。

コンソールまたはメッセージボックスに出力する場合、2つのバックスラッシュまたは1つで表示されますか?

実際二重の円記号を単一の円記号に置き換えたい場合は、簡単です。

text = text.Replace(@"\\", @"\");

...しかし、私の推測では、元のファイルには二重のバックスラッシュが含まれていません。それでも解決しない場合は、詳細をお知らせください。

編集:編集された質問に対する応答で、stringToBeReplacedにはバックスラッシュが1つしかありません。本当に。 2つのバックスラッシュが表示されている場合、その視聴者はそれをエスケープしています。文字列自体に2つのバックスラッシュはありません。 stringToBeReplaced.Lengthおよび文字をカウントします。

66
Jon Skeet

投稿の手順を試しましたが、成功しませんでした。

これは私がデバッガから得たものです: enter image description here

Sqliteデータベースに保存する元の文字列はb\r\naでした。それらを読むと、b\\r\\na(デバッガーの長さは6:"b" "\" "\r" "\" "\n" "a")を取得し、この文字列を置き換えて取得します再び長さ6の文字列(上の図で確認できます)。

テストフォームでテキストボックスを1つだけ使用してこの短いスクリプトを実行します。

private void Form_Load(object sender, EventArgs e)
    {
        string x = "b\\r\\na";
        string y = x.Replace(@"\\", @"\");
        this.textBox.Text = y + "\r\n\r\nLength: " + y.Length.ToString();
    }

私はこれをテキストボックスに取得します(したがって、「b」と「a」の間に改行文字はありません:

b\r\na

Length: 6

この文字列を使用してバックスラッシュのエスケープを解除するにはどうすればよいですか? (「b」と「a」の間の改行を期待しています。)

解決策:

\r\nは1文字であるため、これは標準の置換では実行できません。文字列の一部を文字ごとに置き換えることはできますが、1文字の「半分」を置き換えることはできません。そのため、次のように特殊文字を個別に置き換える必要があります。

private void Form_Load(object sender, EventArgs e) {
    ...
    string z = x.Replace(@"\r\n", Environment.NewLine);
    ...

これは私にとって正しい結果を生み出します:

b
a
6
Atiris

誰かがこれにこだわって、上記の答えのどれもうまくいかなかった場合、以下が私のために働いたものです。それが役に立てば幸い。

var oldString = "\\r|\\n";

// None of these worked for me
// var newString = oldString(@"\\", @"\");
// var newString = oldString.Replace("\\\\", "\\");
// var newString = oldString.Replace("\\u5b89", "\u5b89");
// var newString = Regex.Replace(oldString , @"\\", @"\");

// This is what worked
var newString = Regex.Unescape(oldString);
// newString is now "\r|\n"
5
niki b

文字列に単一の円記号が含まれている場合でも、デバッガーが単一の円記号と二重の円記号を表示するというジョンスキートの答えを読むまで、私は同じ問題を抱えていました。私はそれを知りませんでした。だから私はからコードを変更しました

text2 = text1.Replace(@"\\", @"/");

text2 = text1.Replace(@"\", @"/");

そしてそれは問題を解決しました。注:パスストリングで単一のスラッシュを使用するR.Netとのインターフェイスです。

2

試してください-

var newstring = @"a\\b".Replace(@"\\",@"\");
1
ipr101
string a = @"a\\b";
a = a.Replace(@"\\",@"\");

動作するはずです。時計のVisual STudioでは、エスケープされた「\」が表示されるため、単一の代わりに「\」が表示されることに注意してください。

0
Felice Pollano

次のように単純に文字列を置換することができます

Str.Replace(@"\\",@"\");
0
Mehran