web-dev-qa-db-ja.com

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

string.Formatを使用して大括弧をエスケープするにはどうすればよいですか。例えば:

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

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

角かっこをエスケープする方法はありますか?

920
Pop Catalin

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

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

{を出力するには{{を使い、}を出力するには}}を使います。

1212
Jorge Ferreira

{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 および 文字列フォーマットFAQ

198
Guru Kara

もうすぐそこ!中括弧のエスケープシーケンスは{{または}}なので、あなたの例では次のようにします。

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

あなたはあなたのページに一つの括弧だけを表示することになる二重の開き括弧と二重の閉じ括弧を使うことができます。

22
elec

中括弧 AND 文字列補間の使用 は、興味深い課題になります。 文字列補間 parsingおよび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>
12

C#でjson文字列をアドホックに(クラス/オブジェクトを直列化せずに)作成する方法を探しています。言い換えれば、C#で Interpolated Stringsを使用しながら中括弧と引用符をエスケープする方法 "と" 逐語的な文字列リテラル "( '@'プレフィックス付きの二重引用符で囲まれた文字列).

var json = $@"{{""name"":""{name}""}}";
6
Adam Cox
[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);
}
5
pomber

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

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

私の目的:

"{CR}{LF}"string変数delimiterに代入する必要がありました。

コードc#:

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

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

0
Goldfish