Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 转义字符串中的大括号{以支持string.Format_C#_.net - Fatal编程技术网

C# 转义字符串中的大括号{以支持string.Format

C# 转义字符串中的大括号{以支持string.Format,c#,.net,C#,.net,我有从数据库读取的字符串,这些字符串被输入String.Format方法,如果字符串有“{'}”大括号,但这些大括号没有正确地转义为String.Format(即添加另一个“{”以转义它们)字符串。Format将引发异常 字符串有这些大括号的任意组合,因此本质上,该方法需要遍历字符串并确定“{”是否有一个结束符,以及它们是否一起构成string.Format(即{5})的有效占位符,即不需要正确转义的占位符 我可以写一个方法来实现这一点,但我想知道是否有任何东西内置到.NET中,或者有任何东西已

我有从数据库读取的字符串,这些字符串被输入String.Format方法,如果字符串有“{'}”大括号,但这些大括号没有正确地转义为String.Format(即添加另一个“{”以转义它们)字符串。Format将引发异常

字符串有这些大括号的任意组合,因此本质上,该方法需要遍历字符串并确定“{”是否有一个结束符,以及它们是否一起构成string.Format(即{5})的有效占位符,即不需要正确转义的占位符

我可以写一个方法来实现这一点,但我想知道是否有任何东西内置到.NET中,或者有任何东西已经做到了这一点

字符串示例如下所示:

您好{0},有关更多信息,请参阅我们的用户手册{或联系我们:XXXX}”


如您所知,将其输入字符串。Format将在{或联系我们:XXXX}

上引发异常。是否可以为自定义处理工具使用其他转义字符?因为您选择了一个已使用的转义字符

如果不可能,那么另一个选项是在存储它时转义它。当string.Format结束时,它将自动取消转义

var s = string.Format("Hello {0} please ... {{or contact}}", customer.Name );
// Now use s as needed 
// now is: "Hello Joe please ... {or contact}"
这个怎么样:

string input = "Hello {0}, please refer for more information {or contact us at: XXXX}";
   Regex rgx = new Regex("(\\{(?!\\d+})[^}]+})");
string replacement = "{$1}";
string result = rgx.Replace(input, replacement);

Console.WriteLine("String {0}", result);

// Hello {0}, please refer for more information {{or contact us at: XXXX}}
…假设唯一不应转义的字符串的格式为
{\d+}

这里有两个警告。首先,我们可能会遇到已经转义的曲线大括号-
{{
。修复它更不容易:添加更多的lookarounds

Regex rgx = new Regex("(\\{(?!\\d+})(?!\\{)(?<!\\{\\{)[^}]+})");
作为旁注,尽管我是那种喜欢有两个问题的人(嗯,有点),但当我看到这一点时,我确实会发抖

更新:如您所说,如果您需要避免每次出现
{
}
,那么您的任务实际上要简单一点-但我想您需要两次通过:

Regex firstPass = new Regex("(\\{(?!\\d+[^} ]*}))");
string firstPassEscape = "{$1";
...
Regex secondPass        = new Regex("((?<!\\{\\d+[^} ]*)})");
string secondPassEscape = "$1}";
Regex firstPass=newregex((\\{(?\\d+[^}]*}));
字符串firstPassEscape=“{$1”;
...
Regex secondPass=新的Regex(“(?Try:


如果你能保证永远不想转义{digit},那么一个示例输入和输出将是非常简单的正则表达式。这些字符串是从哪里来的?限制输入(并禁止{})不是更容易吗?或者如果有效的占位符与无效的占位符来自不同的位置,则可以很容易地转义“无效”占位符零件并将零件连接在一起。是否可以为自定义处理工具使用不同的转义字符?您选择了一个已使用的转义字符。其他选项是在存储时转义,并在字符串.Format发生后取消转义…
var s=string.Format(“Hello{0}plese{{or contact}},…)
你能控制将字符串插入数据库的代码吗?如果是这样的话,我想如果你用双大括号存储它会更容易些。如果这不是一个选项,你想对字符串
“{{{{
(已经加倍)做什么?保持原样,或者把它变成
”{{{{{
?如何处理更复杂的格式字符串,例如
{0:d}
?+1-尽管可能值得考虑格式字符串的可选部分:SOMEFORMAT;例如;string date=string.format(“{0:dd/mm/yyyy}”);更新了答案,提到了两个可能的失败点;它表明,实际上需要三到四次才能使它(再次,更多-更少)正确。这很好,但我需要说明可能出现单个“{”或“}”的地方。@Pacman再次更新了答案;现在我并不认为
{{
不应该被转换成
{{{{
,这也反映在最后的代码片段中。)请提供一些关于这个正则表达式为什么应该工作的细节。这个答案在“Log Quality Posts”列表中。如果
{…},这个正则表达式将失败
string至少包含一个数字。如果我想理解这个问题,他希望转义不属于格式规范的大括号…例如,他希望转义{hello}之类的内容,而不是{0}{1}之类的内容感谢回复,但请记住,字符串也可能只有一个字符{'不是两者都有,或者它们可以向后显示,就像这样。}'{'我仍然认为在插入时必须保护它们。
Regex firstPass = new Regex("(\\{(?!\\d+[^} ]*}))");
string firstPassEscape = "{$1";
...
Regex secondPass        = new Regex("((?<!\\{\\d+[^} ]*)})");
string secondPassEscape = "$1}";
myString = Regex.Replace(myString, @"\{(\D+)\}", "{{$1}}");