这个怎么样:
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}";