假设您已将文本文件加载到字符串中,并且您希望将所有Unicode转义符转换为字符串内的实际Unicode字符。
示例:
“以下是Unicode'\ u2320'中整数字符的上半部分,这是下半部分'\ U2321'。”
答案 0 :(得分:45)
答案很简单,适用于至少有几千个字符的字符串。
示例1:
Regex rx = new Regex( @"\\[uU]([0-9A-F]{4})" );
result = rx.Replace( result, match => ((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString() );
示例2:
Regex rx = new Regex( @"\\[uU]([0-9A-F]{4})" );
result = rx.Replace( result, delegate (Match match) { return ((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString(); } );
第一个示例显示使用lambda表达式(C#3.0)进行替换,第二个示例使用应该使用C#2.0的委托。
为了分解这里发生的事情,首先我们创建一个正则表达式:
new Regex( @"\\[uU]([0-9A-F]{4})" );
然后我们用字符串'result'调用Replace()和一个匿名方法(第一个例子中的lambda表达式和第二个例子中的委托 - 委托也可以是常规方法),它转换找到的每个正则表达式在字符串中。
Unicode转义处理如下:
((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString(); });
获取表示转义的数字部分的字符串(跳过前两个字符)。
match.Value.Substring(2)
使用Int32.Parse()解析该字符串,该字符串采用Parse()函数应该期望的字符串和数字格式,在这种情况下是十六进制数。
NumberStyles.HexNumber
然后我们将结果数转换为Unicode字符:
(char)
最后我们在Unicode字符上调用ToString(),它给出了它的字符串表示形式,这是传递给Replace()的值:
.ToString()
注意:不是抓取要通过Substring调用转换的文本,而是使用match参数的GroupCollection,并使用正则表达式中的子表达式来捕获数字('2320'),但这更复杂,可读性更低
答案 1 :(得分:9)
重构一点:
Regex regex = new Regex (@"\\U([0-9A-F]{4})", RegexOptions.IgnoreCase);
string line = "...";
line = regex.Replace (line, match => ((char)int.Parse (match.Groups[1].Value,
NumberStyles.HexNumber)).ToString ());
答案 2 :(得分:5)
这是VB.NET的等价物:
Dim rx As New RegularExpressions.Regex("\\[uU]([0-9A-Fa-f]{4})")
result = rx.Replace(result, Function(match) CChar(ChrW(Int32.Parse(match.Value.Substring(2), Globalization.NumberStyles.HexNumber))).ToString())
答案 3 :(得分:0)
我认为你最好将小写字母添加到正则表达式中。它对我来说效果更好。
Regex rx = new Regex(@"\\[uU]([0-9A-Fa-f]{4})");
result = rx.Replace(result, match => ((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString());