Ctrl-M的正则表达式问题

时间:2010-07-07 09:49:02

标签: java regex

我想匹配以下内容:

boolean b = "\u000D".matches("\\cM");

但是编译器给了我:

unclosed string literal
illegal character: \92
illegal character: \92
unclosed string literal
not a statement

为什么呢?该文字不是有效的unicode Ctrl-m unicode代码???

3 个答案:

答案 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:]]')