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

标签 java regex

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

这段代码有什么问题?

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

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

感谢您的帮助。

最佳答案

不要转义不需要转义的:

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

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

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

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

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

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

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

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

关于字符类中的 Java Regex 非法转义字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7604879/

相关文章:

java - 读取写得不好的csv

javascript - 如何获取仅包含存在于任何字符和空格之间的大写字母的字符串

java - 是否可以通过路径访问 jar 内的资源?

java - 使用Scanner读取文件Java时无限循环

java - 如何为 Spring Boot 中的所有错误配置/设置重定向?

java - 重构模式匹配序列

Python 正则表达式集合中的 0 个或多个单词

java - Android从文件路径获取图像到位图

java - 如何处理一个请求来自不同服务器的多个数据库结果

regex - 使用 Text.Regex.PCRE 解析网页标题缺少字符