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

时间:2012-10-01 22:35:12

标签: c# .net

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

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

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

字符串示例如下:

您好{0},请参阅我们的用户手册以获取更多信息{或通过以下方式联系我们:XXXX}“

正如你可以告诉我们将它提供给String.Format会在 {或联系我们:XXXX}

上抛出异常

3 个答案:

答案 0 :(得分:2)

这个怎么样:

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+}

这里有两个警告。首先,我们可能会遇到已经逃脱的曲线括号 - {{。修复它更容易:添加更多的外观...

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

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

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

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

作为一个旁注,即使我是那些真正喜欢有两个问题的人(好吧,有点),当我看到这个时,我会感到不寒而栗。

更新:如果按照您的说法,您需要逃避{}的每一次出现,那么您的任务实际上要容易一些 - 但您需要在这里两次通过,我想:

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

答案 1 :(得分:0)

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

如果不可能,那么其​​他选项是在存储它时将其转义。当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}"

答案 2 :(得分:0)

尝试:

myString = Regex.Replace(myString, @"\{(\D+)\}", "{{$1}}");