Java Regex Недопустимый Escape-символ в символьном классе - PullRequest
13 голосов
/ 30 сентября 2011

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

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

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

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

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

1 Ответ

29 голосов
/ 30 сентября 2011

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

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())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...