Java Regex Недопустимый символ побега в классе символов

Я пытаюсь определить, имеет ли выражение, переданное в мой класс Expressions, оператор. Либо +-*/^ для добавления, вычитания, умножения, деления и экспоненты соответственно.

Что не так с этим кодом?

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

Я думал, что у меня были специальные символы, которые были экранированы должным образом, но я продолжаю получать ошибку: " незаконный escape-символ" при попытке компиляции.

Спасибо за вашу помощь.

Ответы

Ответ 1

Не избегайте того, чего не нужно избегать:

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

должен работать нормально. Большинство метасимволов регулярных выражений (., (, ), +, * и т.д.) Теряют свое особое значение при использовании в классе символов. Те, на которые нужно обратить внимание, - это [, -, ^ и ]. И за последние три года вы можете стратегически разместить в них класс char, чтобы они не придавали особого значения:

  • ^ может быть размещен в любом месте, кроме сразу после открывающей скобки: [a^]
  • - можно разместить сразу после открытия кронштейна или прямо перед закрывающим кронштейном: [-a] или [a-]
  • ] можно разместить сразу после открытия скобки: []a]

Но для справки в будущем, если вам нужно включить обратную косую черту в качестве escape-символа в строке регулярного выражения, вам нужно будет сбежать дважды, например:

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

Итак, чтобы соответствовать буквальной обратной косой чертой, вам понадобится четыре из них:

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

Другое примечание: String.matches() будет пытаться сопоставить всю строку с шаблоном, поэтому, если ваша строка не состоит из нескольких операторов, вам нужно использовать вместо нее что-то вроде .matches(".*[-+*/^].*"); (или использовать Matcher.find())