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