2012-01-27 14 views
5

¿hay alguna manera de obtener todos los resultados posibles de un patrón de expresión regular ?. todo lo que he visto se refiere a un patrón que se evalúa contra una cadena. pero lo que necesito es tener un patrón de esta manera:¿hay alguna forma de obtener todos los resultados posibles de un patrón de expresión regular?

^EM1650S(B{1,2}|L{1,2})?$ 

generar todas las posibles coincidencias:

EM1650S 
EM1650SB 
EM1650SBB 
EM1650SL 
EM1650SLL 
+0

No se ve muy a menudo porque la gran mayoría de los patrones de expresiones regulares tienden a tener un número infinito de posibles resultados. – Amber

+2

No infinito. Simplemente enorme. – Alfabravo

+0

Deseo que sea posible. – ShankarSangoli

Respuesta

1

En este caso particular, sí. La expresión regular genera un número finito de cadena válida, por lo que se pueden contar.

Simplemente tendrá que analizar la expresión regular. Parte de eso (EM1650S) es obligatorio, así que piense por el resto. Parse por el | (o) símbolo. Luego enumere las cadenas para ambos lados de la misma. Entonces puedes obtener todas las combinaciones posibles de ellos.

Algunos regex (que contienen * o + símbolos) pueden representar un número infinito de cadenas, por lo que no se pueden contar.

+0

Creo que el OP está buscando alguna indicación de _how get the result_, not _only_ if se puede hacer ... – cdeszaq

+0

Sí, lo sé. :) – 0605002

+0

Esto es una indicación sobre cómo hacerlo, no es fácil, no espero que nadie se tome su tiempo para escribir el código para el OP –

2

En el caso general, no. En este caso, casi no tiene espacio de solución.

Hay un section covering this in Higher Order Perl (PDF) y un Perl module. Nunca lo volví a implementar en otra cosa, pero tuve un problema similar y esta solución fue adecuada para necesidades limitadas de manera similar.

2

Hay herramientas que pueden mostrar todas las coincidencias posibles de una expresión regular.

Aquí está uno escrito en Haskell: https://github.com/audreyt/regex-genex y aquí es un módulo Perl: http://metacpan.org/pod/Regexp::Genex

Lamentablemente no pude encontrar nada JavaScript

+1

Interesante. Regexp-Genex limita '*' a '{0,3}' y '+' a '{1,4}', aparentemente para hacerlo más bonito, pero eso tiene el efecto secundario de eliminar el espacio infinito de soluciones que la mayoría de los expresiones regulares tener. –

+1

Cool, el genex supone que '*' es '{0,3}' y '+' es '{1,4}' y por lo tanto produce un número finito de permutaciones. Vaya, este es mi segundo comentario de que llego tarde y termina siendo una copia del comentario de otra persona. –

+0

Sí, no es perfecto. Aquí hay un hilo de discusión en Reddit sobre este tema: http://www.reddit.com/r/programming/comments/hya57/from_a_regex_generate_all_possible_strings_it_can/ –

1

Desde un punto de vista teórico computacional, las expresiones regulares son equivalentes a finita máquinas de estado. Esto es parte de la "teoría del autómata". Puede crear una máquina de estados finitos que sea equivalente a una expresión regular y luego usar algoritmos de cruce de gráficos para recorrer todas las rutas del FSM. En el caso general, un número infinitamente contable de cadenas puede coincidir con una expresión regular, por lo que su programa nunca puede terminar dependiendo de la expresión regular de entrada.

Cuestiones relacionadas