转义大括号{在一个字符串中支持String.Format

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

该字符串具有这些大括号的任意组合,因此本质上该方法需要检查字符串并确定'{'是否有关闭字符串,并且如果它们一起形成String.Format的有效占位符(即{5}) ,那些不需要被正确转义的人。

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

字符串示例如下:

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

正如您可以告诉将此内容添加到String.Format中会在{或联系我们:XXXX}处抛出异常


这个怎么样:

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+})(?!{)(?<!{{)[^}]+})");

......换句话说,当试图更换一个支架时,确保它是一个孤独的支架。 )

其次,格式本身可能并不那么简单 - 因为字符串中实际可能存在的复杂性会增加,正则表达式也会如此。 例如,这个小小的beasty将不会尝试修复以数字开头的格式字符串,然后一直到}符号,而在它们之间没有任何空格:

Regex rgx = new Regex("({(?!dS*})(?!{)(?<!{{)[^}]+})");

作为一个旁注,尽管我是那些真正喜欢有两个问题的人中的一员,但是当我看到这个时,我感到不寒而栗。

更新:如果像你说的那样,你需要逃避{}每一次出现,你的任务实际上更容易一些 - 但是我想这里需要两次传球:

Regex firstPass = new Regex("({(?!d+[^} ]*}))");
string firstPassEscape = "{$1";
...
Regex secondPass        = new Regex("((?<!{d+[^} ]*)})");
string secondPassEscape = "$1}";

是否有可能为您的自定义处理工具使用不同的转义字符? 因为你选择了一个已经被采纳的!

如果这是不可能的,那么其他选择是在存储它时逃脱它。 当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}"

尝试:

myString = Regex.Replace(myString, @"{(D+)}", "{{$1}}");
链接地址: http://www.djcxy.com/p/51479.html

上一篇: escape curly braces { in a string to support String.Format

下一篇: String.Format with curly braces