ChatGPT解决这个技术问题 Extra ChatGPT

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

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

例如:

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

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

有没有办法逃脱括号?

MSDN 字符串格式常见问题解答 msdn.microsoft.com/en-us/netframework/aa569608:如何以字符串格式写出大括号?转义的大括号是否有任何我需要注意的奇怪行为?如何使用字符串格式写出类似“{42.00}”的内容?
不幸的是,上面的 MSDN 链接已损坏。目前,正确的链接似乎是 msdn.microsoft.com/en-us/library/…(请参阅底部的 QA 部分,或在页面上搜索“escape”)。

P
Peter Mortensen

要输出 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}

"{{" 被视为格式字符串中的转义括号字符。
但是,如果您想为字符串说明符添加值格式,您还需要阅读下面 Guru Kara 的答案。
阅读官方文档 Composite Formatting 中的转义大括号部分。
它也适用于新的 C# 6 字符串插值 ($"a = {{ {a} }}")
在 C# 6 字符串插值方式上更具体,在卷曲上加倍工作就像 string v = $" foo {{{t}}}";。如果您有其他字符要转义,那不是卷曲,您可以使用 $@ 组合 string v2 = $@"\foo {{{t}}}\";
P
Peter Mortensen

是的,要在 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}

参考文章

String.Format 问题

字符串格式常见问题解答


如果我遇到那个错误,我会写 string.Format( "{{{0}}}", i.ToString("N") ); 这可能对某些人来说更具可读性。
@Happy它可能会,但是您会发现自己指定了两次 FormatProvider ,有可能会指定不同的,或者错过一个。
M
Michael Irigoyen

差不多好了!大括号的转义序列是 {{}},因此对于您的示例,您将使用:

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

R
Ryan Berger

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


S
SliverNinja - MSFT

转义 花括号 并使用 字符串插值 是一个有趣的挑战。您需要使用四方括号来转义字符串插值解析和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>

P
Peter Mortensen

我来这里是为了寻找如何在 C# 中临时构建 JSON 字符串(不序列化类/对象)。换句话说,如何在使用 Interpolated Strings in C# 和 "verbatim string literals" (带有 '@' 前缀的双引号字符串)时转义大括号和引号,例如...

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

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

P
Peter Mortensen

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

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

P
Peter Mortensen

我的目标:

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

C#代码:

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

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


M
Mohamed Anas

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


P
Peter Mortensen

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

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

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

这似乎是 Jorge Ferreira's answer 和/或 Aarif's answer 的抄袭版本(包括拼写错误)(原始修订版)。