-
TRRE: expresiones regulares de transducción
-
Resumen
- Es una extensión de las expresiones regulares para la edición de texto y herramientas de línea de comandos similares a
grep.
- Es un prototipo, así que no debe usarse en entornos reales.
-
Introducción
- Las expresiones regulares son una herramienta útil para buscar patrones en texto.
- Como no parecían naturales para la edición de texto, se propone una extensión.
- Se llaman expresiones regulares de transducción o
trre.
- Se usa el símbolo
: para definir transformaciones.
a:b es la forma más simple: sustituye a por b.
- Se creó una herramienta de línea de comandos llamada
trre para demostrar el concepto.
-
Ejemplos
-
Básico
- Cambiar
cat por dog:
$ echo 'cat' | trre 'c:da:ot:g'
dog
- Reemplazar todas las coincidencias de una cadena, como en
sed:
$ echo 'Mary had a little lamb.' | trre '(lamb):(cat)'
Mary had a little cat.
- Eliminación:
$ echo 'xor' | trre '(x:)or'
or
- Inserción:
$ echo 'or' | trre '(:x)or'
xor
-
Expresiones regulares mediante transducción
-
Transformación de rangos
-
Generador
-
Especificación del lenguaje
trre se define como un par patrón-de-coincidencia:patrón-de-generación.
patrón-de-coincidencia puede ser una cadena o una expresión regular.
patrón-de-generación normalmente es una cadena, pero también puede ser una regex.
-
Por qué funciona
trre construye un autómata especial llamado transductor finito de estados (FST).
- Un FST procesa pares de entrada-salida.
-
Decisiones de diseño y preguntas abiertas
- Hay que tomar varias decisiones sobre la asociatividad de
:, la precedencia, el épsilon implícito, etc.
-
Modos y avidez
trre admite dos modos:
- Modo de escaneo (predeterminado): aplica las transformaciones de manera secuencial.
- Modo de coincidencia: verifica la cadena completa contra la expresión.
-
Determinización
- Es importante el proceso de convertir un autómata no determinista en uno determinista.
-
Rendimiento
- La versión NFT (no determinista) es un poco más lenta que
sed.
- En tareas complejas,
trre_dft (la versión determinista) puede rendir mejor que sed.
-
TODO
- Completar el conjunto de funciones ERE, soporte completo de Unicode, manejo eficiente de rangos y más.
-
Referencias
- Está inspirado en artículos de Russ Cox y en artículos académicos de Cyril Allauzen y Mehryar Mohri.
1 comentarios
Comentarios de Hacker News
Qué bueno, espero con interés la evolución de este proyecto
cat:dogse interprete comoca(t:d)ogen lugar de(cat):(dog)Recomienda XFST (Xerox Finite-State Transducer)
Recomienda Rosie Pattern Language como alternativa a las expresiones regulares estándar
Comparte la experiencia de haber escrito un artículo sobre transductores de estado finito en 1997
:tenga una unión más fuerte queabSiente que no es suficiente para realizar sustituciones estructurales
Pone en duda la afirmación de que las expresiones regulares son antinaturales para editar texto
Elogia que el código en C está muy limpio
theory.pdfdel README está mal y necesita correcciónCuestiona el consejo de no usar
*ni+Siente que el primer ejemplo es extraño
echo 'cat' | trre 'c:da:ot:g'es raroSe pregunta si los ejemplos son realmente la salida del programa
echo 'cat dog' | trre 'c:bat|d:hog'es extraño