我有来自RTF文档的以下行
10 \u8314?\u8805? 0
(以明文10 ⁺≥ 0
表示)。您可以看到特殊字符使用\u
后跟十进制unicode和一个问号(在无法显示特殊字符的情况下应该打印的替换字符)进行转义。我希望将文本放在C#中的字符串变量中,该变量等效于以下变量:
string expected = "10 \u207A\u2265 0";
在调试器中,我希望变量的值为10 ⁺≥ 0
。因此,我必须用相应的十六进制unicode替换每个出现的次数(#207A = 8314和#2265 = 8805)。使用正则表达式实现此目的的最简单方法是什么?
答案 0 :(得分:3)
代码是:
string str = @"10 \u8314?\u8805? 0";
string replaced = Regex.Replace(str, @"\\u([0-9]+)\?", match => {
string value = match.Groups[1].Value;
string hex = @"\u" + int.Parse(value).ToString("X4");
return hex;
});
这将返回
string line = @"10 \u207A\u2265 0";
所以\u207A\u2265
不会被转义。
请注意,该值首先转换为数字(int.Parse(value)
),然后转换为固定符号4位十六进制数字(ToString("X4")
)
或
string replaced = Regex.Replace(str, @"\\u([0-9]+)\?", match => {
string value = match.Groups[1].Value;
char ch = (char)int.Parse(value);
return ch.ToString();
});
这将返回
string line = @"10 ⁺≥ 0";
答案 1 :(得分:1)
你必须使用MatchEvaluator:
string input = "10 \u8314?\u8805? 0";
Regex reg = new Regex(@"\\u([A-Fa-f0-9]+)\?",RegexOptions.Multiline);
string result = reg.Replace(input, delegate(Match m) {
return ConvertToWhatYouWant(m.Value);
});
答案 2 :(得分:1)
如果我正确理解了你的问题,你想要将RTF的unicode表示解析为C#字符串。
因此,单线解决方案看起来像这样
string result = Regex.Replace(line, @"\\u(\d+?)\?", new MatchEvaluator(m => ((char)Convert.ToInt32(m.Groups[1].Value)).ToString()));
但我建议使用更干净的代码:
private static string ReplaceRtfUnicodeChar(Match match) {
int number = Convert.ToInt32(match.Groups[1].Value);
char chr = (char)number;
return chr.ToString();
}
public static void Main(string[] args)
{
string line= @"10 \u8314?\u8805? 0";
var r = new Regex(@"\\u(\d+?)\?");
string result = r.Replace(line, new MatchEvaluator(ReplaceRtfUnicodeChar));
Console.WriteLine(result); // Displays 10 ⁺≥ 0
}