2009-12-26 6 views
10

¿Hay algún motor de expresiones regulares (gratuito) para Java que pueda compilar una expresión regular a un DFA y hacer una captura de grupo al mismo tiempo que coincide con el DFA?Motores de expresión regular basados ​​en DFA para Java con Capture

He encontrado dk.brics.automaton y jrexx, que compilan ambos a DFA, pero ninguno parece ser capaz de realizar una captura de grupo. Mientras que los otros motores que he encontrado parecen compilar a NFA.

+1

¿Por qué necesita un DFA? –

+1

Para la optimización del rendimiento. – Sami

+3

Lo estoy preguntando porque, por lo general, los beneficios de rendimiento surgen de la incapacidad de los motores DFA para dar marcha atrás. Si ese es el caso, tal vez podría lograr lo mismo usando agrupación atómica/cuantificadores posesivos. ¿Tal vez podría publicar algunos ejemplos de lo que quiere lograr? –

Respuesta

-2

puede probar la biblioteca de expresiones regulares Pat @http://www.javaregex.com/.

+0

Desde el sitio web, al menos no es nada obvio, que este motor estaría basado en DFA ni que admitiría la captura de grupos. Si es así, y lo hace, ¿podría confirmar? – Sami

+0

That lib (Stevesoft Pat) admite grupos de captura, pero definitivamente no ** está ** basado en DFA. –

0

Para C hay TRE y las bibliotecas de Google RE2. TRE usa DFA, RE2 usa NFA (por lo que yo entiendo), ambos podrían hacer coincidir subgrupos. Pero no vi tal biblioteca para Java.

+1

RE2 es realmente REALMENTE rápido. Vale la pena señalarlo cuando las personas solicitan expresiones regulares y velocidad. – nes1983

+1

Lo tienes mezclado. TRE usa NFA, RE2 usa ambos, NFA y DFA. Específicamente, RE2 usa un DFA si hay como máximo un grupo de captura, de lo contrario, un NFA. – nes1983

3

tratar este (probablemente no DFA pero más rápido que java.util) http://jregex.sourceforge.net/gstarted-advanced.html#ngroups, o esta otra: http://userguide.icu-project.org

acuerdo con esa prueba: http://tusker.org/regex/regex_benchmark.html, ambos son rápidos (todos sabemos que los puntos de referencia sólo prueba lo que el creador del punto de referencia quería probar).

Cuando necesitaba DGE regex realmente rápido, he generado un proceso que usaba grep ;-) (Para un archivo de registro de 6GB, reducía mis tiempos de 10 minutos a algunos segundos).

+0

Dudo que sea más rápido que java.util.regex. Estas pequeñas bibliotecas van y vienen, java.util.regex se optimiza año tras año. Si no estás usando un algoritmo mejor, java.util.regex te ganará eventualmente. Consulte mi respuesta para un motor de expresiones regulares que es bastante diferente de java.util.regex, basado en DFA y, por lo tanto, más rápido. – nes1983

-2

dk.brics.automaton parece que DFA hace grupos de captura. Espero que esa característica sea nueva en los dos años desde esta pregunta. Mira la clase AutomatonMatcher.

Ver http://www.brics.dk/automaton/doc/dk/brics/automaton/AutomatonMatcher.html#group(int)

+0

En realidad, no es compatible con la coincidencia de grupos. – nes1983

+0

Actualizado con el enlace a API de captura de grupo –

+0

Sí, pero ¿has leído ese enlace? "no admite la captura de grupos; el único grupo válido es 0 (la coincidencia completa)". – nes1983

Cuestiones relacionadas