.NETのフォーマット文字列で中括弧(中括弧)をエスケープする方法


988

を使用してブラケットをエスケープする方法string.Format

例えば:

String val = "1,2,3"
String.Format(" foo {{0}}", val); 

この例は例外をスローしませんが、文字列を出力しますfoo {0}

括弧をエスケープする方法はありますか?


1
MSDN文字列のフォーマットに関するFAQ msdn.microsoft.com/en-us/netframework/aa569608:文字列の形式で中かっこを書き出すにはどうすればよいですか?エスケープされた中かっこには、知っておく必要がある奇妙な動作がありますか?文字列フォーマットを使用して「{42.00}」のようなものを書き出すにはどうすればよいですか?
gerryLowry

1
残念ながら、上記のMSDNリンクは壊れています。現在、正しいリンクはmsdn.microsoft.com/en-us/library/…のようです(下部にあるQAセクションを参照するか、ページで "escape"を検索してください)。
Palo Mraz 2017

回答:


1283

出力foo {1, 2, 3}するには、次のようなことを行う必要があります。

string t = "1, 2, 3";
string v = String.Format(" foo {{{0}}}", t);

{使用{{して出力し、}を使用して出力します}}

または、このようにc#文字列補間を使用することもできます(C#6.0で利用可能な機能)

ブラケットのエスケープ:文字列補間$( "")。C#6.0の新機能です

var inVal = "1, 2, 3";
var outVal = $" foo {{{inVal}}}";
//Output will be:  foo {1, 2, 3}

108
「{{」は、フォーマット文字列ではエスケープされたブラケット文字として扱われます。
アイスラバ2008

5
ただし、文字列指定子に値の書式を追加する場合は、以下のGuru Karaからの回答も読む必要があります。
Nick

公式ドキュメントの「複合フォーマット」の「エスケープブレース」のセクションをお読みください。
Jeppe Stig Nielsen

8
新しいC#6文字列補間($"a = {{ {a} }}")でも機能しています
Mahmoodvcs

C#6の文字列補間方法をより具体的にすると、カーリーを2倍にすると、次のようになりstring v = $" foo {{{t}}}";ます。カーリーではないエスケープする他の文字がある場合は、$ @コンボを使用できますstring v2 = $@"\foo {{{t}}}\";
Nhan

209

はい{string.Formatあなたはこのようにそれをエスケープする必要があります{{

したがって、この

String val = "1,2,3";
String.Format(" foo {{{0}}}", val);

出力します"foo {1,2,3}"

しかし、C#の設計バグについて知っておく必要があります。つまり、上記のロジックを実行することで、以下のコードが{24.00}を出力すると想定します。

int i = 24;
string str = String.Format("{{{0:N}}}", i); //gives '{N}' instead of {24.00}

しかし、これは{N}を出力します。これは、C#がエスケープシーケンスとフォーマット文字を解析する方法が原因です。上記のケースで目的の値を取得するには、代わりにこれを使用する必要があります。

String.Format("{0}{1:N}{2}", "{", i, "}") //evaluates to {24.00}

参照記事 String.Format gottachおよび String Formatting FAQ


12
私がそのバグに遭遇した場合、私はstring.Format( "{{{0}}}", i.ToString("N") );一部の人にとってより読みやすいかもしれないと書くでしょう。
HappyNomad 2014年

1
@Happy可能性はありますが、FormatProviderを2回指定することになり、別のものを指定したり、1つを見落としたりするリスクがあります。
ClickRick 2015

74

あと少しです!ブレースのエスケープシーケンスがある{{か、}}そうあなたの例のためにあなたが使用します。

string t = "1, 2, 3";
string v = String.Format(" foo {{{0}}}", t);

22

二重の開き角括弧と二重の閉じ角括弧を使用すると、ページに1つの角括弧のみが表示されます。


13

中括弧をエスケープし、文字列補間を使用すると、興味深い課題が生じます。文字列補間の解析と解析をエスケープするには、四重括弧を使用する必要があります。string.format

ブラケットのエスケープ:文字列補間$( "")とString.Format

string localVar = "dynamic";
string templateString = $@"<h2>{0}</h2><div>this is my {localVar} template using a {{{{custom tag}}}}</div>";
string result = string.Format(templateString, "String Interpolation");

// OUTPUT: <h2>String Interpolation</h2><div>this is my dynamic template using a {custom tag}</div>

8

C#で(クラス/オブジェクトをシリアル化せずに)json文字列をアドホックに構築する方法を探してここに来ました。言い換えると、C#で補間された文字と「逐語的文字列リテラル」(接頭辞 '@'が付いた二重引用符で囲まれた文字列)を使用しながら、中括弧と引用符をエスケープする方法は次のようになります...

var json = $@"{{""name"":""{name}""}}";

5
[TestMethod]
public void BraceEscapingTest()
{
    var result = String.Format("Foo {{0}}", "1,2,3");  //"1,2,3" is not parsed
    Assert.AreEqual("Foo {0}", result);

    result = String.Format("Foo {{{0}}}", "1,2,3");
    Assert.AreEqual("Foo {1,2,3}", result);

    result = String.Format("Foo {0} {{bar}}", "1,2,3");
    Assert.AreEqual("Foo 1,2,3 {bar}", result);

    result = String.Format("{{{0:N}}}", 24); //24 is not parsed, see @Guru Kara answer
    Assert.AreEqual("{N}", result);

    result = String.Format("{0}{1:N}{2}", "{", 24, "}");
    Assert.AreEqual("{24.00}", result);

    result = String.Format("{{{0}}}", 24.ToString("N"));
    Assert.AreEqual("{24.00}", result);
}

2

または、このようなc#文字列補間を使用できます(C#6.0で利用可能な機能)

var value = "1, 2, 3";
var output = $" foo {{{value}}}";

1

大括弧のエスケープ:文字列補間$( ""):

今、このようなc#文字列補間を使用することもできます(C#6.0で利用可能な機能)

var inVal= "1, 2, 3";
var outVal= $" foo {{{inVal}}}";
//Output will be:  foo {1, 2, 3}

0

私の目的:

"{CR}{LF}"string変数に割り当てる必要がありましたdelimiter

コードc#:

string delimiter= "{{CR}}{{LF}}";

注:通常、特殊文字をエスケープするには、を使用する必要があります。中括弧{を開くには、{{のように1つ余分に使用します。中括弧}を閉じるには、1つの追加の}}を使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.