5

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

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

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

字符串示例如下:

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

如您所知,将其输入 String.Format 将在{或联系我们:XXXX}上引发异常

4

3 回答 3

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

...假设唯一不应该转义的字符串是 format {\d+}

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

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

...换句话说,在尝试更换支架时,请确保它是一个单独的支架。)

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

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

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

更新:如果,正如你所说,你需要逃避每一次出现{and },你的任务实际上更容易一些 - 但你需要在这里两次通过,我想:

Regex firstPass = new Regex("(\\{(?!\\d+[^} ]*}))");
string firstPassEscape = "{$1";
...
Regex secondPass        = new Regex("((?<!\\{\\d+[^} ]*)})");
string secondPassEscape = "$1}";
于 2012-10-01T22:55:01.103 回答
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}"
于 2012-10-01T22:46:15.713 回答
0

尝试:

myString = Regex.Replace(myString, @"\{(\D+)\}", "{{$1}}");
于 2012-10-01T23:03:52.343 回答