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

Ant*_*ack 13 java regex

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

这段代码有什么问题?

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

我认为我已经正确地转义了特殊字符,但是在尝试编译时我不断收到错误:" 非法转义字符 ".

谢谢你的帮助.

Nul*_*ion 30

不要逃避不需要逃脱的东西:

return expression.matches("[-+*/^]+");
Run Code Online (Sandbox Code Playgroud)

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

  • ^ 可以放在开口括号后面的任何地方: [a^]
  • -可以放在开口支架之后或关闭支架之前:[-a][a-]
  • ] 可以放在开口支架后面: []a]

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

"\\(.*?\\)" // match something inside parentheses
Run Code Online (Sandbox Code Playgroud)

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

"hello\\\\world" // this regex matches hello\world
Run Code Online (Sandbox Code Playgroud)

另一个注意事项:String.matches()将尝试将整个字符串与模式匹配,因此除非您的字符串只包含一堆运算符,否则您需要使用类似的东西.matches(".*[-+*/^].*");(或使用Matcher.find())