对于我正在做的项目,我必须读取一个字符串。该字符串可以包含一个或多个unicode字符的十六进制表示(例如“š”的“\ u0161”)。我想将这些代码转换为正确的字符表示。
为此,我首先需要检测我的String中是否存在格式为“\ uAAAA”的十六进制序列,因此我编写了以下正则表达式:
Pattern classPattern = Pattern.compile("\\u[0-9a-fA-F]{4}");
Matcher classMatcher = classPattern.matcher("\\u1ECD");
System.out.println(classMatcher.find());
不幸的是,这会生成“java.util.regex.PatternSyntaxException:索引2附近的非法Unicode转义序列”错误。
但是,如果我替换“\”,只是出于“@”的测试目的,正则表达式按预期工作:
Pattern classPattern = Pattern.compile("@u[0-9a-fA-F]{4}");
Matcher classMatcher = classPattern.matcher("@u1ECD");
System.out.println(classMatcher.find());
这让我相信我在反斜杠上做错了。我还尝试了许多其他序列,但没有一个能够工作。请帮忙。
答案 0 :(得分:3)
'\ u'在Java正则表达式世界中具有特殊含义,即围绕匹配实际的unicode字符。你必须双重转义\
以获得你想要的匹配。
Pattern classPattern = Pattern.compile("\\\\u[0-9a-fA-F]{4}");
[更新]正如评论所指出的那样,我给出正确答案的理由存在缺陷。