我有一个包含多个unicode字符的字符串。我想识别所有这些unicode字符,例如: \ uF06C ,并将其替换为反斜杠和四个六角形数字,而不包含“u”。
示例:
源字符串:“添加\ uF06Cd1子句”
结果字符串:“添加\ F06Cd1子句”
如何在Java中实现这一目标?
修改
链接Java Regex - How to replace a pattern or how to中的问题与此不同,因为我的问题涉及unicode字符。虽然它有多个文字,但它被jvm视为单个字符,因此正则表达式不起作用。
答案 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”,“\”);