Java 第一个字符为\时正则表达式中出现错误,可与任何其他字符配合使用
对于我正在做的项目,我必须读取字符串。此字符串可能包含一个或多个unicode字符的十六进制表示形式(例如“\u0161”表示“š”)。我想将这些代码转换为正确的字符表示形式 为此,我首先需要检测字符串中是否存在格式为“\uAAAA”的十六进制序列,因此我编写了以下正则表达式:Java 第一个字符为\时正则表达式中出现错误,可与任何其他字符配合使用,java,regex,Java,Regex,对于我正在做的项目,我必须读取字符串。此字符串可能包含一个或多个unicode字符的十六进制表示形式(例如“\u0161”表示“š”)。我想将这些代码转换为正确的字符表示形式 为此,我首先需要检测字符串中是否存在格式为“\uAAAA”的十六进制序列,因此我编写了以下正则表达式: Pattern classPattern = Pattern.compile("\\u[0-9a-fA-F]{4}"); Matcher classMatcher = classPattern.matcher("\\u1
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());
这让我相信我在反斜杠上做错了什么。我也尝试了许多其他的序列,但没有一个成功。请提供帮助。在Java正则表达式世界中,“\u”有一个特殊的含义,即与实际的unicode字符相匹配。你必须双倍转义\
才能得到你想要的匹配
Pattern classPattern = Pattern.compile("\\\\u[0-9a-fA-F]{4}");
[更新]正如评论所指出的,我给出正确答案的理由是有缺陷的。在Java正则表达式世界中,“\u”有一个特殊的含义,即与实际的unicode字符相匹配。你必须双倍转义\
才能得到你想要的匹配
Pattern classPattern = Pattern.compile("\\\\u[0-9a-fA-F]{4}");
[更新]正如评论所指出的,我给出正确答案的推理是有缺陷的。这与以下
u
或\u
没有任何关系:将文本反斜杠编码到正则表达式中需要java文本字符串中的4个反斜杠,因为反斜杠被转义了两次——一次在java中,另一次在regex中。这确实是一个以错误的理由推荐正确事物的例子。@Bohemian:是的,你是对的,早上读得太快太早了。谢谢。它与下面的u
或\u
没有任何关系:将文本反斜杠编码到正则表达式中需要java文本字符串中的4个反斜杠,因为反斜杠被转义了两次——一次在java中,另一次在regex中。这确实是一个以错误的理由推荐正确事物的例子。@Bohemian:是的,你是对的,早上读得太快太早了。谢谢