正则表达式将所有出现的情况替换为从要替换的部件“派生”的内容

本文关键字:替换 派生 正则表达式 情况 | 更新日期: 2023-09-27 18:34:15

>我有来自RTF文档的以下行

10 'u8314?'u8805? 0

(以明文10 ⁺≥ 0说)。您可以看到特殊字符的转义'u后跟十进制 unicode 和一个问号(这是在无法显示特殊字符的情况下应打印的替换字符)。我想在 C# 中的字符串变量中包含文本,该变量等效于以下变量:

string expected = "10 'u207A'u2265 0";

在调试器中,我希望看到变量的值为 10 ⁺≥ 0 。因此,我必须用相应的十六进制 unicode 替换每个出现的情况(#207A = 8314 和 #2265 = 8805)。使用正则表达式实现此目的的最简单方法是什么?

正则表达式将所有出现的情况替换为从要替换的部件“派生”的内容

代码为:

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";

如果我正确理解了您的问题,您希望将 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
}

您必须使用 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); 
});