我想匹配以下内容:
boolean b = "\u000D".matches("\\cM");
但是编译器给了我:
unclosed string literal
illegal character: \92
illegal character: \92
unclosed string literal
not a statement
为什么呢?该文字不是有效的unicode Ctrl-m unicode代码???
答案 0 :(得分:3)
unclosed string literal
的问题是因为the \uXXXX
sequences are resolved before lexing。所以
boolean b = "\u000D".matches("\\cM");
变为
boolean b = "
".matches("\\cM");
这是无效的Java代码。 (是的,这也意味着你可以写String foo = \u0022\u0021\u0022;
并正确编译。)
如果你写了
boolean b = "\r".matches("\\cM"); // \r == \u000D
然后代码工作并返回true
。
答案 1 :(得分:1)
这是一个陷阱!
Java处理Unicode在解释之前转义。 因此,它将您的代码转换为:
boolean b = "
".matches("\\cM");
..所以,它绝对是一个错误 - 未完成的字符串等等。
答案 2 :(得分:0)
这可能不相关,但我想从数据库(Vertica)中的字段中删除 Ctrl + m 。
我使用了以下功能,它对我有用。
REGEXP_REPLACE(<column_name>,'[[:cntrl:]]')