วิธีการหลีกเลี่ยงวงเล็บปีกกา (วงเล็บปีกกา) ในสตริงรูปแบบใน. NET


988

วงเล็บสามารถหนีการใช้งานstring.Formatได้อย่างไร

ตัวอย่างเช่น:

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

ตัวอย่างเช่นนี้ไม่ได้โยนยกเว้น foo {0}แต่เอาท์พุทสตริง

มีวิธีใดบ้างที่จะหลบหนีวงเล็บได้หรือไม่?


1
คำถามที่พบบ่อยเกี่ยวกับการจัดรูปแบบสตริงของ MSDN msdn.microsoft.com/en-us/netframework/aa569608 : ฉันจะเขียนวงเล็บเหลี่ยมแบบหยิกในรูปแบบสตริงได้อย่างไร วงเล็บปีกกาที่หนีออกมานั้นมีพฤติกรรมแปลก ๆ ที่ฉันต้องระวังหรือไม่? ฉันจะใช้การจัดรูปแบบสตริงเพื่อเขียนบางอย่างเช่น "{42.00}" ได้อย่างไร
gerryLowry

1
ขออภัยลิงค์ MSDN ด้านบนใช้งานไม่ได้ ขณะนี้ลิงก์ที่ถูกต้องน่าจะเป็นmsdn.microsoft.com/en-us/library/… (ดูที่ส่วนของ QA ด้านล่างหรือค้นหา "escape" บนหน้า)
Palo Mraz

คำตอบ:


1283

สำหรับคุณที่จะส่งออกfoo {1, 2, 3}คุณต้องทำสิ่งที่ชอบ:

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

การส่งออก{ที่คุณใช้{{และเพื่อการส่งออกที่คุณใช้}}}

หรือตอนนี้คุณสามารถใช้การแก้ไข c # string เช่นนี้ได้ (คุณสมบัติที่มีใน C # 6.0)

หนีวงเล็บ: String แก้ไข $ ( "") มันเป็นคุณสมบัติใหม่ใน C # 6.0

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

108
"{{" ถูกใช้เป็นอักขระเครื่องหมายวงเล็บเหลี่ยมในรูปแบบสตริง
icelava

5
แต่ถ้าคุณต้องการเพิ่มการจัดรูปแบบค่าให้ตัวระบุสตริงของคุณคุณต้องอ่านคำตอบจาก Guru Kara ด้านล่างด้วย
Nick

อ่านส่วนหนีการจัดฟันในเอกสารอย่างเป็นทางการคอมโพสิตจัดรูปแบบ
Jeppe Stig Nielsen

8
นอกจากนี้ยังทำงานในการแก้ไขสตริง C # 6 ใหม่ ( $"a = {{ {a} }}")
Mahmoodvcs

เฉพาะเจาะจงมากขึ้นใน C # 6 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 # แยกวิเคราะห์ escape sequences และอักขระการจัดรูปแบบ ในการรับค่าที่ต้องการในกรณีข้างต้นคุณต้องใช้สิ่งนี้แทน

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

การอ้างอิงบทความ String.Fottat gottachและ การจัดรูปแบบสตริงคำถามที่พบบ่อย


12
หากฉันพบข้อผิดพลาดนั้นฉันจะเขียนstring.Format( "{{{0}}}", i.ToString("N") );สิ่งที่อ่านได้ง่ายกว่า
HappyNomad

1
@Happy มันอาจ แต่คุณจะพบว่าคุณระบุ FormatProvider สองครั้งด้วยความเสี่ยงที่คุณจะระบุคนอื่นหรือพลาด
ClickRick

74

เกือบจะมี! ลำดับหนีรั้งเป็น{{หรือ}}ดังนั้นสำหรับตัวอย่างของคุณคุณจะใช้:

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

22

คุณสามารถใช้วงเล็บเปิดคู่และวงเล็บปิดคู่ซึ่งจะแสดงวงเล็บหนึ่งบนหน้าของคุณ


13

การหลีกเลี่ยงวงเล็บปีกกาและใช้การแก้ไขสตริงทำให้เกิดความท้าทายที่น่าสนใจ คุณต้องใช้เครื่องหมายวงเล็บสี่เท่าเพื่อหลีกเลี่ยงการแยกวิเคราะห์สตริงและการstring.formatวิเคราะห์คำ

การหลีกเลี่ยงวงเล็บ: String Interpolation $ ("") และ 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

มาที่นี่เพื่อค้นหาวิธีการสร้างสตริง json ad-hoc (โดยไม่ต้องซีเรียลคลาส / วัตถุ) ใน C # กล่าวอีกนัยหนึ่งคือวิธีการหลีกเลี่ยงวงเล็บปีกกาและเครื่องหมายคำพูดในขณะที่ใช้Interpolated Strings ใน C #และ " ตัวอักษรสตริง verbatim " (สตริงที่ยกมาสองครั้งด้วยคำนำหน้า '@'), เช่น ...

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 # string เช่นนี้ (คุณสมบัติที่มีใน C # 6.0)

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

1

การหลีกเลี่ยงวงเล็บ: String Interpolation $ (""):

ตอนนี้คุณสามารถใช้การแก้ไข c # string เช่นนี้ได้ (คุณลักษณะที่มีใน C # 6.0)

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

0

วัตถุประสงค์ของฉัน:

ฉันต้องการที่จะกำหนดค่า"{CR}{LF}"ให้กับตัวแปรstringdelimiter

รหัส c #:

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

หมายเหตุ: เพื่อหลีกเลี่ยงอักขระพิเศษโดยปกติคุณต้องใช้ สำหรับการเปิดวงเล็บปีกกา {ให้ใช้หนึ่งอย่างพิเศษ {{ สำหรับการปิดวงเล็บปีกกา} ให้ใช้หนึ่งอันพิเศษ}}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.