Java 替换字符串中的 Unicode 字符
Java Replace Unicode Characters in a String
我有一个包含多个 unicode 字符的字符串。我想识别所有这些 unicode 字符,例如:\ uF06C,并将其替换为反斜杠和四个没有 "u"[=32= 的十六进制数字]里面。
示例:
源字符串:"add \uF06Cd1 Clause"
结果字符串:"add \F06Cd1 Clause"
如何在 Java 中实现这一点?
编辑:
link Java Regex - How to replace a pattern or how to 中的问题与此不同,因为我的问题涉及 unicode 字符。虽然它有多个文字,但它被 jvm 视为一个字符,因此正则表达式将不起作用。
尝试使用 String.replaceAll() 方法
s = s.replaceAll("\u", "\");
正确的做法是使用正则表达式来匹配整个 unicode 定义并使用 group-replacement。
匹配 unicode-string 的正则表达式:
A unicode-character 看起来像 \uABCD
,所以 \u
,后跟 4 个字符的十六进制数字字符串。可以使用
来匹配这些
\u[A-Fa-f\d]{4}
但这有一个问题:
在像 "just some \uabcd arbitrary text" 这样的 String
中,\u
仍然会匹配。所以我们需要确保 \u
之前有偶数个 \
s:
(?<!\)(\\)*\u[A-Fa-f\d]{4}
现在作为输出,我们需要一个反斜杠后跟 hexnum-part。这可以通过group-replacement来完成,所以让我们从分组字符开始:
(?<!\)(\\)*(\u)([A-Fa-f\d]{4})
作为替换,我们希望匹配两个反斜杠的组中的所有反斜杠,后跟一个反斜杠和 unicode-literal:
的 hexnum-part
\
现在是实际代码:
String pattern = "(?<!\\)(\\\\)*(\\u)([A-Fa-f\d]{4})";
String replace = "\\";
Matcher match = Pattern.compile(pattern).matcher(test);
String result = match.replaceAll(replace);
反斜杠太多了!那么,java、正则表达式和反斜杠存在一个问题:反斜杠需要在 java 和 正则表达式中转义。所以“\\\\”作为 java 中的 pattern-string 匹配一个 \ 作为 regex-matched 字符。
编辑:
在实际字符串中,字符需要被过滤掉并替换为它们的 integer-representation:
StringBuilder sb = new StringBuilder();
for(char c : in.toCharArray())
if(c > 127)
sb.append("\").append(String.format("%04x", (int) c));
else
sb.append(c);
这假设 "unicode-character" 你的意思是 non-ASCII-characters。此代码将按原样打印任何 ASCII-character,并将所有其他字符输出为反斜杠,后跟 unicode-code。 "unicode-character" 的定义相当模糊,因为 java 中的 char
总是表示 unicode-character。这种方法保留任何 control-chars,如“\n”、“\r”等,这就是我选择它而不是其他定义的原因。
我有一个包含多个 unicode 字符的字符串。我想识别所有这些 unicode 字符,例如:\ uF06C,并将其替换为反斜杠和四个没有 "u"[=32= 的十六进制数字]里面。
示例:
源字符串:"add \uF06Cd1 Clause"
结果字符串:"add \F06Cd1 Clause"
如何在 Java 中实现这一点?
编辑:
link Java Regex - How to replace a pattern or how to 中的问题与此不同,因为我的问题涉及 unicode 字符。虽然它有多个文字,但它被 jvm 视为一个字符,因此正则表达式将不起作用。
尝试使用 String.replaceAll() 方法
s = s.replaceAll("\u", "\");
正确的做法是使用正则表达式来匹配整个 unicode 定义并使用 group-replacement。
匹配 unicode-string 的正则表达式:
A unicode-character 看起来像 \uABCD
,所以 \u
,后跟 4 个字符的十六进制数字字符串。可以使用
\u[A-Fa-f\d]{4}
但这有一个问题:
在像 "just some \uabcd arbitrary text" 这样的 String
中,\u
仍然会匹配。所以我们需要确保 \u
之前有偶数个 \
s:
(?<!\)(\\)*\u[A-Fa-f\d]{4}
现在作为输出,我们需要一个反斜杠后跟 hexnum-part。这可以通过group-replacement来完成,所以让我们从分组字符开始:
(?<!\)(\\)*(\u)([A-Fa-f\d]{4})
作为替换,我们希望匹配两个反斜杠的组中的所有反斜杠,后跟一个反斜杠和 unicode-literal:
的 hexnum-part\
现在是实际代码:
String pattern = "(?<!\\)(\\\\)*(\\u)([A-Fa-f\d]{4})";
String replace = "\\";
Matcher match = Pattern.compile(pattern).matcher(test);
String result = match.replaceAll(replace);
反斜杠太多了!那么,java、正则表达式和反斜杠存在一个问题:反斜杠需要在 java 和 正则表达式中转义。所以“\\\\”作为 java 中的 pattern-string 匹配一个 \ 作为 regex-matched 字符。
编辑:
在实际字符串中,字符需要被过滤掉并替换为它们的 integer-representation:
StringBuilder sb = new StringBuilder();
for(char c : in.toCharArray())
if(c > 127)
sb.append("\").append(String.format("%04x", (int) c));
else
sb.append(c);
这假设 "unicode-character" 你的意思是 non-ASCII-characters。此代码将按原样打印任何 ASCII-character,并将所有其他字符输出为反斜杠,后跟 unicode-code。 "unicode-character" 的定义相当模糊,因为 java 中的 char
总是表示 unicode-character。这种方法保留任何 control-chars,如“\n”、“\r”等,这就是我选择它而不是其他定义的原因。