2017-01-15 4 views
0

Ich habe eine Zeichenfolge, die mehrere Unicode-Zeichen enthält. Ich möchte alle diese Unicode-Zeichen, zB: \ uF06C, und ersetzen Sie es durch einen Schrägstrich und vier Hexa-Ziffern ohne "u" darin.Java Ersetze Unicode-Zeichen in einem String

Beispiel:

Quelle String: "add \ uF06Cd1 Klausel"

Ergebnis String: "add \ F06Cd1 Klausel"

Wie kann dies in Java erreichen?

Edit:

Frage in Verbindung Java Regex - How to replace a pattern or how to unterscheidet sich von diesem als meine Frage beschäftigt sich mit Unicode-Zeichen. Obwohl es mehrere Literale hat, wird es von jvm als ein einzelnes Zeichen betrachtet und deshalb funktioniert Regex nicht.

+3

Mögliche Duplikate von [Java Regex - So ersetzen Sie ein Muster oder wie] (http://stackoverflow.com/questions/9285231/java-regex-how-to-replace-a-pattern-or-how- zu) – Paul

+0

Frage in Verbindung Java Regex - Wie ein Muster oder wie zu ersetzen, ist dies anders als meine Frage beschäftigt sich mit Unicode-Zeichen. Obwohl es mehrere Literale hat, wird es von jvm als ein einzelnes Zeichen betrachtet und deshalb funktioniert Regex nicht. – Maz

Antwort

0

Der richtige Weg, dies zu tun, ist eine Regex zu verwenden, um die gesamte Unicode-Definition zu entsprechen und Gruppenersatz zu verwenden.

Die Regex die Unicode-String zu:

Ein Unicode-Zeichen wie \uABCD aussieht, so \u, durch einen String mit 4 Zeichen HexNumber gefolgt. Passende diese können mit fertig

\\u[A-Fa-f\d]{4} 

Aber es gibt ein Problem mit diesem:
In einem String wie „nur einige \\ uabcd beliebigen Text“ die \u würde noch angepasst bekommen. Also müssen wir sicherstellen, dass die \u durch eine gerade Anzahl von \ s vorausgeht:

(?<!\\)(\\\\)*\\u[A-Fa-f\d]{4} 

nun als Ausgang, wollen wir einen umgekehrten Schrägstrich durch den hexnum-Teil gefolgt. Dies kann durch die Gruppe-Ersatz durchgeführt werden, also lassen Sie sich durch die Gruppierung Zeichen beginnen zu erhalten:

(?<!\\)(\\\\)*(\\u)([A-Fa-f\d]{4}) 

Als Ersatz haben wir alle Rückschläge aus der Gruppe wollen die zwei Schrägstriche übereinstimmt, gefolgt von einem Backslash und dem hexnum-Teil der Unicode-wörtliche:

$1\\$3 

Jetzt für den eigentlichen Code:

String pattern = "(?<!\\\\)(\\\\\\\\)*(\\\\u)([A-Fa-f\\d]{4})"; 
String replace = "$1\\\\$3"; 

Matcher match = Pattern.compile(pattern).matcher(test); 
String result = match.replaceAll(replace); 

das ist eine Menge von umgekehrten Schrägstrichen ist! Nun, es gibt ein Problem mit Java, Regex und Backslash: Backslashes müssen in Java und Regex maskiert werden. So entspricht "\\\\" als Musterzeichenfolge in Java einem als regulär abgeglichenen Zeichen.

EDIT:
Auf aktuellen Strings, müssen die Zeichen herausgefiltert werden und durch ihre ganze Zahl-Darstellung ersetzt werden:

StringBuilder sb = new StringBuilder(); 
for(char c : in.toCharArray()) 
    if(c > 127) 
     sb.append("\\").append(String.format("%04x", (int) c)); 
    else 
     sb.append(c); 

Dies setzt voraus, durch „Unicode-Zeichen“ Sie bedeuten nicht-ASCII-Zeichen . Dieser Code wird ein beliebiges ASCII-Zeichen ausgeben und alle anderen Zeichen als Backslash gefolgt von ihrem Unicode-Code ausgeben. Die Definition "Unicode-Zeichen" ist jedoch ziemlich vage, da in Java immer Unicode-Zeichen stehen. Bei diesem Ansatz werden Kontrollzeichen wie "\ n", "\ r" usw. beibehalten, weshalb ich sie anderen Definitionen vorgezogen habe.

+0

versuchte dies auch. Es gibt mir das gleiche Ergebnis wie die Quelle. – Maz

+0

@Maz hast du es auf den Quellcode oder das String-Literal ausgeführt? Wenn Sie es direkt auf der Zeichenfolge ausführen, müssen Sie zu einem anderen Ansatz greifen. Diese Antwort soll den Quellcode filtern, nicht die eigentliche Zeichenkette. – Paul

+0

Habe nicht ganz verstanden, was Quellcode ist. Ich habe eine eigenständige Klasse erstellt, um das zu testen. Ich definiere ein String-Literal, das ** add d1-Klausel ** hat, wie 'String s =" add \ uF06Cd1-Klausel ";', und verwende dann 4 Zeilen des Codes aus deinem Kommentar. Das Ergebnis entspricht dem Zeichenfolgenliteral. – Maz

-1

Versuchen Sie es mit String.replaceAll() Methode

s = s.replaceAll ("\ u", "\");

+0

Nun, das wird die meiste Zeit funktionieren. Aber wie wäre es mit einer Saite wie "... \\ u ....". Das ist kein Unicode-Zeichen, aber Ihr Code wird es gerne überschreiben. Dies ist definitiv nicht sicher zu verwenden, da es früher oder später bricht. – Paul

+0

Dieser gibt Kompilierungsfehler. Beim Entkommen gibt es nicht das gewünschte Ergebnis. – Maz

Verwandte Themen