2011-09-30 7 views
13

Próbuję określić, czy wyrażenie przekazane do mojej klasy Wyrażeń ma operatora. Albo +-*/^, odpowiednio dla dodawania, odejmowania, mnożenia, dzielenia i wykładania.Wyekscytowanie niedozwolonego znaku Java Regex w klasie znaków

Co jest nie tak z tym kodem?

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

Myślałem, że miałem znaki specjalne uciekł prawidłowo ale wciąż otrzymuję błąd: „niedozwolony znak escape” podczas próby kompilacji.

Dzięki za pomoc.

Odpowiedz

27

Nie uciec, co nie musi być uciekł:

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

powinno działać dobrze. Większość metaznaków wyrażeń regularnych (., (,, +, itp.) Traci swoje specjalne znaczenie, gdy jest używana w klasie znaków. Te, na które należy zwrócić uwagę, to: [, -, ^ i ]. I przez ostatnie trzy, można strategicznie umieścić w nich char klasę, żeby nie brać ich szczególne znaczenie:

  • ^ może być umieszczony w dowolnym miejscu z wyjątkiem tuż po nawiasie otwierającym: [a^]
  • - mogą być umieszczane zaraz po uchwytu otwierania lub tuż przed wspornikiem zamknięcia: [-a] lub [a-]
  • ] może zostać umieszczony zaraz uchwytu otwierania: []a]

Ale w przyszłości, jeśli trzeba to odwrotny ukośnik jako znak ucieczki w regex ciąg, trzeba uciec go dwukrotnie, np:

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

więc dopasować dosłownego backslash, ty” d potrzeba cztery z nich:

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

Inna uwaga: String.matches() postara się dopasować całą ciąg przeciwko wzoru, więc jeśli ciąg zawiera tylko kilka podmiotów, musisz użyj zamiast tego użyj czegoś takiego jak .matches(".*[-+*/^].*"); (lub użyj Matcher.find())

+0

hah, szykowałam się, że muszę uciec * gdy problem polegał na zamawianiu + - * biorąc pod uwagę zakres "plus za pomocą gwiazdki", a nie " plus lub minus lub gwiazdka ". Dzięki za wyjaśnienie! – WebChemist

Powiązane problemy