これを行う正しい方法は、正規表現を使用してユニコード定義全体を照合し、グループ置換を使用することです。
ユニコード文字列にマッチする正規表現:
ユニコード文字は\uABCD
のように見えるので、\u
、4文字のhexnumber文字列が続きます。マッチングこれらは
\\u[A-Fa-f\d]{4}
を使用して行うことができる。しかしこれに伴う問題があります:\u
はまだマッチになるだろう「ほんの一部\\ uabcd任意のテキスト」などのString
で
が。だから我々は\u
が\
秒の偶数が付け加えていることを確認する必要があります。
(?<!\\)(\\\\)*\\u[A-Fa-f\d]{4}
今すぐ出力として、我々はhexnum部分が続くバックスラッシュをしたいです。これは、グループ交換によって行われ、その者が文字をグループ化することによって開始取得してみましょうすることができます。バックスラッシュとのhexnum部分に続いて、我々は2つのバックスラッシュにマッチするグループからすべてのバックラッシュをしたいの交換として
(?<!\\)(\\\\)*(\\u)([A-Fa-f\d]{4})
ユニコードリテラル:
String pattern = "(?<!\\\\)(\\\\\\\\)*(\\\\u)([A-Fa-f\\d]{4})";
String replace = "$1\\\\$3";
Matcher match = Pattern.compile(pattern).matcher(test);
String result = match.replaceAll(replace);
バックスラッシュがたくさんあります:実際のコードのために今
$1\\$3
!さて、Java、正規表現、バックスラッシュには問題があります。バックスラッシュはjava と正規表現でエスケープする必要があります。したがって、javaのパターン文字列としての "\\\\"は、正規表現と一致する文字の1つと一致します。
EDIT:実際の文字列の
、文字が除外されるように、その整数の表現に置き換えることが必要です
StringBuilder sb = new StringBuilder();
for(char c : in.toCharArray())
if(c > 127)
sb.append("\\").append(String.format("%04x", (int) c));
else
sb.append(c);
これは、あなたが非ASCII-文字を意味する「ユニコード文字」で想定しています。このコードは任意のASCII文字をそのまま出力し、他のすべての文字をバックスラッシュとUnicodeコードで出力します。 javaのchar
は常にUnicode文字を表しているので、 "unicode-character"の定義はやや曖昧です。このアプローチでは、 "\ n"、 "\ r"などの制御文字をそのまま使用するため、他の定義よりも選択しています。
[Java Regex - パターンを置き換える方法または方法](http://stackoverflow.com/questions/9285231/java-regex-how-to-replace-a-pattern-or-how- ) – Paul
リンクの質問Java Regex - どのようにパターンを置き換えるか、または私の質問がユニコード文字を扱うようにこれとは異なる方法。それは複数のリテラルを持っていますが、それはjvmによって1つの文字としてみなされるため、正規表現は機能しません。 – Maz