Esta es una entrada antigua, pero en beneficio de los mismos que encuentra a través de búsquedas en la web como lo hice, no es un módulo de Perl que hace esto, llamado Regexp::Optimizer
, aquí: http://search.cpan.org/~dankogai/Regexp-Optimizer-0.23/lib/Regexp/Optimizer.pm
Toma una expresión regular como entrada, que puede consistir simplemente en la lista de cadenas de entrada separadas con |
, y genera una expresión regular óptima.
Por ejemplo, este comando de la línea de Perl:
perl -mRegexp::Optimizer -e "print Regexp::Optimizer->new->optimize(qr/1231|1233|1234|1236|1238|1247|1256|1258|1259/)"
genera esta salida:
(?^:(?^:12(?:3[13468]|5[689]|47)))
(suponiendo que haya instalado Regex::Optimizer
), que coincide con las expectativas de la OP bastante bien.
He aquí otro ejemplo:
perl -mRegexp::Optimizer -e "print Regexp::Optimizer->new->optimize(qr/314|324|334|3574|384/)"
Y la salida:
(?^:(?^:3(?:[1238]|57)4))
Por comparación, una versión basada en trie óptima sería la salida 3(14|24|34|574|84)
. En la salida anterior, también puede buscar y reemplazar (?:
y (?^:
con sólo (
y eliminar paréntesis redundantes, para obtener esto:
3([1238]|57)4
¿No sería la (corta) de salida de su función de ser algo así como '12 [13 -9] \ {2 \} '? –
Eso coincidiría con las cosas que no están en la lista, p. 1211 – Asmor
Su motor de expresiones regulares ya lo hace por usted si simplemente combina todas las cadenas separadas por '|'. – arnaud576875