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

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

提问人:Pop Catalin 提问时间:9/18/2008 最后编辑:Peter MortensenPop Catalin 更新时间:11/15/2023 访问量:367242

问:

括号在使用中如何转义?string.Format

例如:

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

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

有没有办法转义括号?

C# .NET 字符串 分析 格式

评论

2赞 gerryLowry 11/5/2011
MSDN 字符串格式设置常见问题解答 msdn.microsoft.com/en-us/netframework/aa569608:如何以字符串格式写出大括号?转义的大括号是否有任何我需要注意的奇怪行为?如何使用字符串格式写出类似“{42.00}”的内容?
3赞 Palo Mraz 4/14/2017
不幸的是,上面的MSDN链接已损坏。目前,正确的链接似乎是 msdn.microsoft.com/en-us/library/... (请参阅底部的 QA 部分,或在页面上搜索“escape”)。
0赞 xhafan 4/28/2023
在原始字符串中寻找双卷括号时来到这里。解决方案:如果你在一个字符串中需要 2 个大括号,你必须使用 3 美元,例如:$$$“”“\n{ ”key“: ”{{value}}“ }\n”“”,这意味着对于一个变量,您将使用 3 个大括号(例如 {{{variable}}})。如果您需要在字符串中使用 3 个大括号,请使用 4 美元。

答:

1481赞 Jorge Ferreira 9/18/2008 #1

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

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

要输出 a you use 和 输出 a you use .{{{}}}

或者现在,您还可以像这样使用 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 9/18/2008
“{{”被视为格式字符串中的转义括号字符。
6赞 Nick 3/2/2013
但是,如果你想为你的字符串说明符添加值格式,你还需要阅读下面 Guru Kara 的答案。
2赞 Jeppe Stig Nielsen 4/7/2013
阅读官方文档复合格式中的转义大括号部分。
11赞 Mahmood Dehghan 4/3/2016
它也适用于新的 C# 6 字符串插值 ($"a = {{ {a} }}")
0赞 Nhan 4/15/2016
更具体地说,在 C# 6 字符串插值方式上,在卷曲上加倍工作,如下所示。如果您有其他字符要转义,则该字符不是卷曲,则可以使用 $@ 组合string v = $" foo {{{t}}}";string v2 = $@"\foo {{{t}}}\";
82赞 Wolfwyrd 9/18/2008 #2

快到了!大括号的转义序列是左右,对于您的示例,您将使用:{{}}

string t = "1, 2, 3";
string v = String.Format(" foo {{{0}}}", t);
25赞 elec 3/22/2010 #3

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

230赞 Guru Kara 2/26/2013 #4

是的,要输出,您必须像这样转义它:{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赞 HappyNomad 5/8/2014
如果我遇到那个错误,我会写哪个对某些人来说可能更易读。string.Format( "{{{0}}}", i.ToString("N") );
2赞 ClickRick 4/20/2015
@Happy 可能会,但随后您会发现自己指定了两次 FormatProvider,并且可能会指定不同的 FormatProvider,或者错过一个。
7赞 pomber 5/7/2016 #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);
}
17赞 Adam Cox 4/18/2017 #6

我来这里是为了寻找如何在 C# 中临时构建 JSON 字符串(无需序列化类/对象)。换句话说,如何在 C# 中使用插值字符串和“逐字字符串文字”(带有“@”前缀的双引号字符串)时转义大括号和引号,例如......

var json = $@"{{""name"":""{name}""}}";
16赞 SliverNinja - MSFT 6/21/2017 #7

转义大括号并使用字符串插值是一个有趣的挑战。您需要使用四括号来转义字符串插值解析和解析。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>
4赞 Aarif 1/4/2018 #8

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

var value = "1, 2, 3";
var output = $" foo {{{value}}}";
4赞 Goldfish 4/12/2019 #9

我的目标:

我需要将值分配给变量。"{CR}{LF}"stringdelimiter

C# 代码:

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

注意:要正常转义特殊字符,您必须使用 \。要打开大括号,请使用一个额外的括号,例如 .要关闭大括号,请使用一个额外的括号。{{{}}}

0赞 Manish Kumar Gurjar 10/11/2019 #10

转义括号:字符串插值 $(“”):

现在,您还可以像这样使用 C# 字符串插值(C# 6.0 中提供的功能):

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

评论

3赞 Peter Mortensen 6/14/2021
这似乎是豪尔赫·费雷拉(Jorge Ferreira)的答案和/或Aarif的答案(包括拼写错误)(原始修订版)的剽窃版本。
2赞 Mohamed Anas 2/24/2022 #11

你也可以这样使用。var outVal = $" foo {"{"}{inVal}{"}"} --- {"{"}Also Like This{"}"}"

0赞 Adel Mourad 4/4/2023 #12

我想在字符串插值时逃脱{{Id}}

这对我有用:

string url = $"/Details/{{{{Id}}}}";

输出:

/Details/{{Id}}
1赞 Eldar 11/10/2023 #13

我想把我的两分钱放进去。对于原始字符串文字(以 3 个双引号开头),上述答案将不起作用,但您可以反其道而行之:您可以通过在开头添加来更改要在文本中使用的大括号数。 表示您需要应用模板值。要回答 OP,以下方法将起作用:$$$""" """{{

var formatted = $$"""foo {{{val}}}""";

输出将是:

foo {1, 2, 3}

小提琴