2008-10-08 5 views

Antwort

45

Die Antwort ist einfach und funktioniert gut mit Strings bis zu mehreren tausend Zeichen.

Beispiel 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()); 

Beispiel 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(); }); 

Das erste Beispiel zeigt die Ersetzung unter Verwendung eines Lambda-Ausdruck gemacht werden (C# 3.0) und die zweite verwendet einen Vertreter, die mit arbeiten sollte C# 2.0.

zu brechen, was hier los, zuerst erstellen wir einen regulären Ausdruck:

new Regex(@"\\[uU]([0-9A-F]{4})"); 

Dann rufen wir() mit dem String ‚Ergebnis‘ und eine anonyme Methode (Lambda-Ausdruck in dem ersten Beispiel ersetzen und Der Delegat in der zweiten - der Delegat könnte auch eine reguläre Methode sein - konvertiert jeden regulären Ausdruck, der in der Zeichenfolge gefunden wird.

Die Unicode-Escape wird wie folgt verarbeitet:

((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString(); }); 

die Zeichenfolge Holen Sie sich das Nummernteil der Flucht darstellt (überspringen Sie die ersten beiden Zeichen).

match.Value.Substring(2) 

diese Zeichenfolge Parsen Int32.Parse() verwendet, die die Zeichenfolge und das Zahlenformat nimmt, dass die Parse() Funktion sollte in diesem Fall erwarten, die eine Hex-Zahl ist.

NumberStyles.HexNumber 

Dann werfen wir die resultierende Zahl in ein Unicode-Zeichen:

(char) 

Und schließlich nennen wir ToString() auf der Unicode-Zeichen, die uns Darstellung seiner Zeichenfolge gibt, die den Wert zurück geleitet wird, ersetzen():

.ToString() 

Hinweis: Statt packte den Text, um mit einem Substring umgewandelt rufen Sie konnte das Match Parametergroupcollection verwenden, und ein Teilausdrücke in der reguläre Ausdruck, um nur die Zahl ('2320') zu erfassen, aber das ist komplizierter und weniger lesbar.

+2

\ u und \ U unterschiedlich behandelt werden sollten - \ u angibt 4 Hexadezimalzeichen (16 Bits), wobei \ U 8 spezifiziert (32 Bits) - ein Unicode-Codepunkt ist 21 Bits lang. Außerdem sollten Sie die char.ConvertFromUtf32() -Methode anstelle einer Umwandlung verwenden. –

+0

Ich habe gesehen, \ u und \ U beide Wege dokumentiert, obwohl die aktuelle C# Sprachspezifikation 4 Hex-Bytes für \ U und 8 Hex-Bytes für \ U angibt. In jedem Fall wird \ U mit nur 4 Hex-Ziffern korrekt verarbeitet. Überprüfen Sie, ob sich ConvertFromUtf32() funktional von einem Cast unterscheidet. –

+0

Ja, ich habe die Option "Ignorieren" im zweiten Teil des Posts gelesen, nachdem ich mich selbst erkannt habe. Danke trotzdem. :) – Echilon

8

ein wenig mehr Überarbeitete:

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()); 
0

Ich glaube, Sie besser die kleinen Buchstaben zu Ihrem regulären Ausdruck hinzuzufügen. Es hat besser für mich funktioniert.

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()); 
5

Dies ist das Äquivalent 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()) 
Verwandte Themen