Java正则表达式:字符类中的非法转义字符

13
我正在尝试确定传入我的表达式类中是否有运算符。运算符可以是+-*/^,分别代表加、减、乘、除和指数。
这段代码有什么问题?
private static boolean hasOperator(String expression)
{
    return expression.matches("[\+-\*/\^]+");
}

我本以为我已经正确转义了特殊字符,但编译时仍然出现错误:非法转义字符

谢谢您的帮助。

1个回答

30

不要转义不需要转义的内容:

return expression.matches("[-+*/^]+");

应该能够正常工作。大多数正则表达式元字符(.()+*等)在字符类中使用时失去其特殊含义。您需要注意的是 [-^]。对于后三个字符,您可以将它们放置在字符类中,以便它们不会起到特殊含义:

  • ^ 可以放置在任何位置,除了紧跟在开括号后面:[a^]
  • - 可以放置在开括号后面或闭括号前面:[-a][a-]
  • ] 可以放置在开括号后面:[]a]

但是,如果您需要在正则表达式字符串中包含反斜杠作为转义字符,请记住需要将其转义两次,例如:

"\\(.*?\\)" // match something inside parentheses

因此,如果要匹配一个反斜杠字面值,您需要四个反斜杠:

"hello\\\\world" // this regex matches hello\world

另外需要注意的是,String.matches() 会尝试将整个字符串与模式进行匹配,因此除非你的字符串只由一堆运算符组成,否则你需要使用类似于 .matches(".*[-+*/^].*"); 的东西(或者使用 Matcher.find())。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接