2012-10-03 18 views
6

Empecé a usar el método .match(Regex) en mi programa java, pero por ahora solo estoy usando una cadena (String regexString = new String("[^a-zA-Z0-9][^a-zA-Z0-9]*"); que es lo que tengo hasta ahora, como ejemplo). Sin embargo, sé que puedo usar una expresión regular real (Regex pattern = new Regex() & the Pattern class) y luego compilarla (?) De alguna forma).¿Regex con una cuerda o no regex con una cuerda?

¿Existe alguna ventaja al usar Regex como clase y no solo como cadena, en java? Estoy bastante acostumbrado a bash scripting y los regex son solo 'cuerdas' en el sentido más absoluto, y no hay capacidad/necesidad para una clase separada, así que estoy luchando por ver dónde hay uno aquí.

+2

Nunca escriba 'new String (" ... ");'. Simplemente use '" ... "' en su lugar: 'String regexString =". * ";'. Es innecesario e ineficiente crear explícitamente un nuevo objeto 'String'. – Jesper

+0

¿No se crea un objeto cada vez que hago eso? ¿Qué pasa si tengo varias cadenas separadas? – Pureferret

+3

Sí, si solo usa un literal, por ejemplo '". * "', Se crea un objeto 'String'. Pero si lo hace 'new String (". * ")', Se crea un segundo objeto 'String' que copia el contenido de la cadena literal, lo cual es innecesario. Las cadenas son inmutables en Java. Java tiene un mecanismo de agrupación de cadenas, por lo que si utiliza el mismo literal de cadena varias veces, solo se compartirá un objeto 'String'. – Jesper

Respuesta

7

Haría lo que creyeses más simple y claro.

A Pattern se usa a menudo cuando el rendimiento de una expresión regular es crítico. Si no ha perfilado su aplicación y se ha demostrado que es un problema, es probable que esté usando un simple String.

+0

Una cosa que he dicho es que solo puedes 'emparejar' con una cuerda, no puedes' encontrar', que es algo que me gustaría poder hacer. – Pureferret

+1

Puede 'hacer coincidir (". * "+ Regex +". * ");' En lugar de buscar. –

0

La expresión regular que está intentando utilizar para fines de coincidencia debe transformarse en una máquina de estado de finalización que acepte cualquier texto que coincida con el patrón que proporcionó.

Así, cada vez que usa una expresión regular, por ejemplo en la (nueva expresión String (""). Split (""), se construye un patrón en el fondo, es decir, una máquina de estado finito, que recibe el secuencia de caracteres en su cadena e intenta hacer coincidir la entrada.

Si tiene una expresión regular que usa a menudo y la velocidad es una preocupación real, entonces mantener la máquina de estado finito y no construirlo cada vez es una aceleración importante Puede hacerlo guardando el objeto Pattern entre llamadas sucesivas de coincidencia en diferentes cadenas de salida.

Lo siguiente debería proporcionar algo más de información: http://en.wikipedia.org/wiki/Finite-state_machine

+0

No veo cómo la inicialización de una cadena que se transforma en un patrón que se almacena es muy diferente a un patrón que se inicializó a partir de una cadena y se almacenó ... – Pureferret