C# 正则表达式将所有事件替换为;“派生”;从要更换的零件上拆下

C# 正则表达式将所有事件替换为;“派生”;从要更换的零件上拆下,c#,.net,regex,C#,.net,Regex,我有一个RTF文档中的以下行 10 \u8314?\u8805? 0 (以明文10表示⁺≥ 0)。您可以看到,特殊字符用\u转义,后跟十进制unicode和问号(在无法显示特殊字符的情况下应打印的替换字符)。我希望将文本放在C#中的字符串变量中,该变量相当于以下变量: string expected = "10 \u207A\u2265 0"; 在调试器中,我希望看到变量的值为10⁺≥ 0。因此,我必须用相应的十六进制unicode(#207A=8314和#2265=8805)替换每次出现的

我有一个RTF文档中的以下行

10 \u8314?\u8805? 0
(以明文
10表示⁺≥ 0
)。您可以看到,特殊字符用
\u
转义,后跟十进制unicode和问号(在无法显示特殊字符的情况下应打印的替换字符)。我希望将文本放在C#中的字符串变量中,该变量相当于以下变量:

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

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

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

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

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 line = @"10 ⁺≥ 0";
代码是:

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

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

\u
之后是十进制数,而不是十六进制数。问号是RTF语法的一部分。我在问题中解释了它。它应该是
return(char)int.Parse(value)
否则
replaced
10\\u207A\\u2265 0
而不是
10⁺≥ 0
@David Ah ok:-)您要求“它以明文形式阅读”,所以不清楚您真正想要什么。添加了第二个示例。你几乎是对的。您必须使用
ToString()
字符
char
。您的第二个代码示例符合我的要求。在
\u
之后,它是一个十进制数,而不是十六进制数。问号是RTF语法的一部分。我在问题中解释了它。它应该是
return(char)int.Parse(value)
否则
replaced
10\\u207A\\u2265 0
而不是
10⁺≥ 0
@David Ah ok:-)您要求“它以明文形式阅读”,所以不清楚您真正想要什么。添加了第二个示例。你几乎是对的。您必须
ToString()
字符
char
。您的第二个代码示例正是我想要完成的。您真正想要什么?将“\u8314?\u8805?”替换为“⁺≥" 或者用“\u207A\u2265”?我想用
⁺≥
。太糟糕了,你删除了你的答案。这很好,除了我会选择
\d+
而不是
\d*
。取消删除。我更喜欢使用\d+?因为+(加号)太贪婪了。你真正想要什么?将“\u8314?\u8805?”替换为“⁺≥或者用“\u207A\u2265”?我想用
⁺≥
。太糟糕了,你删除了你的答案。这很好,除了我会选择
\d+
而不是
\d*
。取消删除。我更喜欢使用\d+?因为+(加号)是贪婪的。