我有从数据库中读取的字符串,这些字符串被送入String.Format方法,如果字符串有'{''}'大括号但这些大括号没有正确转义为String.Format(即添加另一个' {'转义它们)String.Format将抛出异常。
字符串具有这些大括号的任意组合,因此本质上该方法需要遍历字符串并确定“{”是否具有结束符号并且如果它们在一起它们形成String.Format的有效占位符(即{ 5}),那些不需要正确转义的。
我可以写一个方法来做到这一点,但是想知道.NET中是否有任何内置,或者其他任何内容已经做到了这一点?
字符串示例如下:
您好{0},请参阅我们的用户手册以获取更多信息{或通过以下方式联系我们:XXXX}“
正如你可以告诉我们将它提供给String.Format会在 {或联系我们:XXXX}
上抛出异常答案 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}}");