Java Regex在字符类中的非法转义字符

时间:2011-09-30 00:44:51

标签: java regex

我正在尝试确定传递给我的Expressions类的表达式是否有运算符。 +-*/^分别用于加,减,乘,除和指数。

此代码有什么问题?

private static boolean hasOperator(String expression)
{
    return expression.matches("[\+-\*/\^]+");
}

我认为我已正确转义了特殊字符,但在尝试编译时,我一直收到错误:“非法转义字符”。

感谢您的帮助。

1 个答案:

答案 0 :(得分:29)

不要逃避不需要逃脱的事情:

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

应该工作得很好。大多数正则表达式元字符(.()+*等)在字符类中使用时会失去其特殊含义。您需要注意的是[-^]。而对于最后三个,你可以策略性地将它们放在char类中,这样它们就不会有它们的特殊含义:

  • ^可以放在开头括号之后的任何位置:[a^]
  • -可以放在左括号之后或右括号之前:[-a][a-]
  • ]可以放在左括号后面:[]a]

但是为了将来参考,如果你需要在正则表达式字符串中包含反斜杠作为转义字符,你需要将其转义两次,例如:

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

因此,要匹配文字反斜杠,您需要其中的四个:

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

另一个注意事项:String.matches()会尝试将整个字符串与模式匹配,所以除非你的字符串只包含一堆运算符,否则你需要使用像而是.matches(".*[-+*/^].*");(或使用Matcher.find()