如何在.NET中的格式化字符串中转义大括号(花括号)

1172
string.Format中如何转义大括号?例如:
String val = "1,2,3"
String.Format(" foo {{0}}", val);

这个示例不会抛出异常,但输出字符串foo {0}

是否有一种方法可以转义这些括号?


2
MSDN字符串格式化常见问题解答 http://msdn.microsoft.com/zh-cn/netframework/aa569608:
我如何在字符串格式中输出花括号?
转义的花括号是否有任何我需要注意的奇怪行为?
我如何使用字符串格式化来输出类似于"{42.00}"这样的内容?
- gerryLowry
3
很抱歉,上面的MSDN链接已经失效。目前正确的链接似乎是https://msdn.microsoft.com/en-us/library/system.string.format(v=vs.110).aspx(请看底部的QA部分,或在页面上搜索“escape”)。 - Palo Mraz
当在原始字符串中寻找双大括号时,请来到这里。解决方案是:如果您需要在字符串中使用2个大括号,则必须使用3个美元符号,示例:$$$"""\n{ "key": "{{value}}" }\n""",这意味着对于变量,您将使用3个大括号(例如 {{{variable}}})。如果您需要在字符串中使用3个大括号,请使用4个美元符号。 - xhafan
13个回答

1478

如果你想输出 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}}}";
// The output will be:  foo {1, 2, 3}

140
在格式化字符串中,"{{" 被视为转义括号字符。 - icelava
6
但如果你想给你的字符串规范化添加值格式,你还需要阅读下面 Guru Kara 的答案。 - Nick
2
请阅读官方文档《组合格式化》(http://msdn.microsoft.com/en-us/library/txafckwd.aspx)中的“转义大括号”部分。 - Jeppe Stig Nielsen
11
它也适用于新的C# 6字符串插值($"a = {{ {a} }}")。 - Mahmood Dehghan
更具体地说,关于C# 6字符串插值的方式,双大括号的重复使用如下所示:string v = $" foo {{{t}}}";。如果您需要转义其他字符而不是大括号,则可以使用$@组合,例如:string v2 = $@"\foo {{{t}}}\"; - Nhan

230

是的,在使用string.Format输出{时,您需要像这样进行转义:{{

因此,以下内容将输出"foo {1,2,3}"

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

但是你需要知道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}

参考文章


14
如果我遇到了那个bug,我会写string.Format("{{{0}}}", i.ToString("N"));,这可能更易读一些。 - HappyNomad
2
@开心 这样也行,但您需要指定两次FormatProvider,有可能会指定不同的或者漏掉一个。 - ClickRick

82

就快完成了!大括号的转义序列是{{}},所以对于您的示例,您应该使用:

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

25

您可以使用双开括号和双闭括号,这将仅在您的页面上显示一个括号。


17

我来到这里是为了寻找如何在C#中即席构建JSON字符串(而不是序列化类/对象)。换句话说,如何在使用C#内插字符串和 "文本字符串字面值"(使用 '@' 前缀的双引号字符串)时转义大括号和引号,例如...

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

16

使用字符串插值和转义花括号会带来有趣的挑战。你需要使用四重花括号来转义字符串插值解析和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>

7
[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);
}

4

我的目标:

我需要将值"{CR}{LF}"分配给一个名为delimiter的字符串变量。

C#代码:

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

注意:要转义特殊字符,通常需要使用反斜杠\。对于左花括号{,使用一个额外的花括号{{。对于右花括号},使用一个额外的花括号}}

4

或者您可以使用 C# 字符串插值,像这样(C# 6.0 中可用的特性):

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

2
你也可以这样使用。 var outVal = $" foo {"{"}{inVal}{"}"} --- {"{"}也像这样{"}"}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接