Java替换字符串中的Unicode字符

时间:2017-01-15 23:46:53

标签: java unicode replace str-replace

我有一个包含多个unicode字符的字符串。我想识别所有这些unicode字符,例如: \ uF06C ,并将其替换为反斜杠和四个六角形数字,而不包含“u”

示例

源字符串:“添加\ uF06Cd1子句”

结果字符串:“添加\ F06Cd1子句”

如何在Java中实现这一目标?

修改

链接Java Regex - How to replace a pattern or how to中的问题与此不同,因为我的问题涉及unicode字符。虽然它有多个文字,但它被jvm视为单个字符,因此正则表达式不起作用。

2 个答案:

答案 0 :(得分:0)

正确的方法是使用正则表达式匹配整个unicode定义并使用group-replacement。

匹配unicode-string的正则表达式:

unicode-character看起来像\uABCD,所以\u,后跟一个4个字符的十六进制数字字符串。匹配这些可以使用

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

但是这有一个问题:
String喜欢"只是一些\\ uabcd任意文本" \u仍会匹配。因此,我们需要确保\u前面有偶数个\ s:

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

现在作为输出,我们想要一个反斜杠后跟hexnum-part。这可以通过组替换来完成,所以让我们从分组字符开始:

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

作为替代,我们希望组中的所有反斜杠都匹配两个反斜杠,然后是反斜杠和unicode-literal的hexnum-part:

$1\\$3

现在为实际代码:

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

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

这有很多反面!好吧,java,regex和反斜杠存在问题:反斜杠需要在java 正则表达式中进行转义。所以&#34; \\\\&#34;作为java中的模式字符串,匹配一个\作为正则表达式匹配的字符。

编辑:
在实际字符串上,需要过滤掉字符并将其替换为整数表示:

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

这假设为&#34; unicode-character&#34;你的意思是非ASCII字符。此代码将按原样打印任何ASCII字符,并将所有其他字符输出为反斜杠,后跟其unicode代码。定义&#34; unicode-character&#34;虽然很模糊,因为java中的char总是代表unicode-characters。这种方法可以保留任何控制字符,如&#34; \ n&#34;,&#34; \ r&#34;等,这就是我选择它而不是其他定义的原因。

答案 1 :(得分:-2)

尝试使用String.replaceAll()方法

s = s.replaceAll(“\ u”,“\”);