关于c#:如何在.NET中的格式字符串中转义大括号(花括号)

How to escape braces (curly brackets) in a format string in .NET

如何在使用string.Format时转义括号。例如:

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

此示例不引发异常,但输出字符串foo {0}

有没有办法摆脱括号?


要输出foo {1, 2, 3},必须执行以下操作:

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

要输出{,使用{{,要输出},使用}}


是的,要在string.Format中输出{,你必须像这个{{那样避开它。

所以这个

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

将输出"foo {1,2,3}"

但是您必须了解C中的一个设计错误,即通过以上逻辑,您可以假定下面的代码将打印24.00

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

但这张照片是n。这是因为C解析转义序列和格式化字符的方式。要在上述情况下获得所需的值,您必须使用它。

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

参考文献string.format gottach和字符串格式常见问题解答


快到了!大括号的转义序列是{{}},因此在您的示例中,您将使用:

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

您可以使用双左括号和双右括号,它们只会在您的页面上显示一个括号。


摆脱花括号和使用字符串插值使一个有趣的挑战。您需要使用四个括号来转义字符串插值解析和string.Format解析。

转义括号:字符串插值$(")和字符串.format

1
2
3
4
5
string localVar ="dynamic";
string templateString = $@"{0}this is my {localVar} template using a {{{{custom tag}}}}";
string result = string.Format(templateString,"String Interpolation");

// OUTPUT: String Interpolationthis is my dynamic template using a {custom tag}

这里是为了寻找如何在C_中特别构建JSON字符串(而不序列化类/对象)。换句话说,当使用C和"逐字字符串文本"(前缀为"@"的双引号字符串)中的内插字符串时,如何转义大括号和引号,例如…

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[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);
}

或者您可以使用这样的C字符串插值(C 6.0中提供的功能)

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

我的目标是:

我需要把值"{CR}{LF}"分配给一个string变量delimiter

C代码:

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

注意:要正常转义特殊字符,必须使用。如果要打开花括号,请额外使用一个类似的括号。要关闭花括号,请额外使用一个。