Java 8 expresión regular para metacaracteres [duplicado]

Si desea saber si una cadena contiene metacaracteres, puede usar algunos como este:

boolean hasIt = sentence.chars().anyMatch(c -> "\\.[]{}()*+?^$|".indexOf(c) >= 0);

Al no utilizar el motor Regex, no necesita citar los caracteres que tienen un significado especial.

El uso Pattern.matchescrea tres obstáculos innecesarios para la tarea. Primero, debe citar todos los caracteres correctamente, luego, necesita una construcción de expresiones regulares para convertir los caracteres en alternativas, por ejemplo , [abc]o en a|b|ctercer lugar, matchesverifica si la cadena completa coincide con el patrón, en lugar de contener ocurrencias, por lo que necesitaría algo quisiera .*pattern.*hacer matchesque se comporte find, si insiste en ello.

Lo que lleva al problema xy de esta tarea. No está claro qué metacaracteres realmente desea verificar y por qué necesita esta información en primer lugar.

Si desea buscar esta oración dentro de otro texto, simplemente use Pattern.compile(sentence, Pattern.LITERAL)para deshabilitar la interpretación de metacaracteres. O Pattern.quote(sentence)cuando quieras armar un patrón que contenga la oración.

Pero si no desea buscarlo, esta información no tiene relevancia. Tenga en cuenta que " ¿Es este un meta personaje? "Puede dar lugar a una respuesta diferente a" ¿Es necesario citar? ". Incluso este tutorial combina estas preguntas de manera engañosa. En dos lugares cercanos, nombra los metacaracteres y describe la sintaxis de las comillas, lo que da la impresión errónea de que todos estos caracteres necesitan comillas.

Por ejemplo, -solo tiene un significado especial dentro de una clase de caracteres, por lo que si no hay una clase de caracteres que detecte por la presencia de [, -no implica la presencia de metacaracteres. Pero aunque -realmente necesita comillas dentro de la clase de caracteres, los personajes =y !metacaracteres son solo en un determinado contexto, lo que requiere un metacarácter, por lo que nunca requieren comillas.

Pero si está intentando verificar un metacarácter para decidir si usar el motor Regex o realizar una búsqueda de texto sin formato, por ejemplo String.indexOf, a través de , está realizando una optimización prematura . Esto no es solo una pérdida de esfuerzo de desarrollo, la optimización incluso antes de tener un código real que podría medir a menudo conduce al resultado opuesto. Realizar una coincidencia de patrones utilizando el motor Regex con una cadena que no contiene metacaracteres puede conducir a una búsqueda más eficiente que un simple indexOfen el String. En la implementación de referencia, el motor Regex utiliza el algoritmo Boyer Moore mientras que los métodos de búsqueda de texto sin formato Stringutilizan una búsqueda ingenua.

Respuesta 1

Esto es un poco de Java String 101. Me encontré con esto recientemente en algún código existente. Mi reacción inicial es que esto es redundante car.setDetails (new String (someStringBufferObj.toString)); En mi ...

¿Cómo podría comparar la entrada que recibo del usuario con un char? Recibiré una carta del usuario (que podría ser mayúscula o minúscula) y luego la compararé con la letra deseada. ...

No puedo elegir entre node.js y Java (Netty). Deseo hacer una estrategia basada en pasos con el proceso del juego como http://www.magicthegatheringtactics.com/ (los usuarios cooperan en las salas de chat y ...

Tengo una actividad ListView cargada con elementos FirebaseDatabse (usuarios). Una vez que hace clic en un elemento de ListView, pasa la Clave de elemento del usuario relacionado (FirebaseDatabase Hash) a otra Actividad, ...