2011-09-30 11 views
13

Estoy tratando de determinar si una expresión pasada a mi clase de expresiones tiene un operador. O bien +-*/^ para sumar, restar, multiplicar, dividir y exponente, respectivamente.Java Regex Carácter ilegal de escape en la clase de caracteres

¿Qué hay de malo en este código?

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

pensé que tenía los caracteres especiales escapados correctamente pero aparece el error: "ilegal carácter de escape" al intentar compilar.

Gracias por su ayuda.

Respuesta

27

no escapan a lo que no necesita ser escapado:

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

debería funcionar bien. La mayoría de los metacaracteres regex (., (, ), +, *, etc.) pierden su significado especial cuando se usan en una clase de caracteres. A los que debe prestar atención son [, -, ^ y ]. Y para los tres últimos, se puede colocar estratégicamente en ellos la clase carbón para que no se toman su significado especial:

  • ^ se puede colocar en cualquier lugar excepto justo después del corchete de apertura: [a^]
  • - se puede colocar justo después del paréntesis de apertura o hacia la derecha antes de que el corchete de cierre: [-a] o [a-]
  • ] se puede colocar inmediatamente después del paréntesis de apertura: []a]

Pero para referencia futura, si es necesario incluir una barra invertida como carácter de escape en una expresión regular, que necesita para escapar de ella en dos ocasiones, por ejemplo:

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

Así que para que coincida con una barra invertida literal,' d necesidad cuatro de ellos:

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

Otra nota: String.matches() trata de hacer coincidir la cadena entera contra el patrón, por lo menos que su cadena consta de sólo un grupo de operadores, que necesita para use use algo como .matches(".*[-+*/^].*"); en su lugar (o use Matcher.find())

+0

ja, me estaba volviendo loco pensando que tenía que escapar * cuando el problema era el pedido + - * lo tomaba como el rango "más por asterisco", en lugar de " más o menos o asterisco ". Gracias por dejar esto en claro! – WebChemist

Cuestiones relacionadas