¿Características comunes a todos los sabores de expresiones regulares?
-
09-06-2019 - |
Pregunta
He visto muchos puntos en común en las capacidades de expresiones regulares de diferentes herramientas/lenguajes habilitados para expresiones regulares (p. ej.perl, sed, java, vim, etc), pero también tengo muchas diferencias.
Hay una estándar ¿Subconjunto de capacidades de expresiones regulares que admitirán todas las herramientas/lenguajes habilitados para expresiones regulares?¿Cómo varían las capacidades de expresiones regulares entre herramientas/idiomas?
Solución
Comparar sabores de expresión regular
Otros consejos
La mayoría de las herramientas/lenguajes de expresión regular admiten estos capacidades básicas:
- Clases/conjuntos de caracteres y su negación - []
- Anclas - ^$
- Alternancia - |
- Cuantificadores - ?+*{n,m}
- Metacaracteres: \w, \s, \d, ...
- Referencias anteriores: \1, \2, ...
- Punto - .
- Modificadores simples como /g y /i para global e ignorar mayúsculas y minúsculas
- Personajes que escapan
Soporte de herramientas/idiomas más avanzados:
- Mirando hacia adelante y hacia atrás
- clases de caracteres POSIX
- Límites de palabras
- Los interruptores en línea permiten no distinguir entre mayúsculas y minúsculas solo para una pequeña sección de la expresión regular
- Modificadores como /x para permitir formato y comentarios adicionales, /m para varias líneas
- Capturas nombradas
- Unicódigo
Si tomó la gramática grep regexp, no la egrep o la gramática sed regexp y la usó, debería usar un subconjunto seguro en muchas plataformas y herramientas.
Lo único que puede molestarle es cuando cambia entre implementaciones de expresiones regulares que utilizan autómatas de estado finito (FSA) y aquellas que utilizan retroceso, por ejemplo.Las implementaciones de cuantificadores variarán de grep a Perl.
Las implementaciones basadas en FSA encontrarán la coincidencia más larga comenzando en la primera posición posible.Los que retrocedan encontrarán la primera coincidencia con tendencia a la izquierda, comenzando en la primera posición posible.Es decir, probará cada rama en el orden del patrón hasta encontrar una coincidencia.
Considere la cuerda "xyxyxyzz"
, y el patrón "(xy)*(xyz)?"
.Los motores basados en FSA coincidirán con la subcadena más larga posible, "xyxyxyz"
.Los motores basados en el seguimiento hacia atrás coincidirán con la primera subcadena con polarización izquierda, "xyxyxy"
.
No hay motor estándar.Sin embargo, el formato de expresión regular extendida POSIX es un subconjunto válido de la mayoría de los motores y probablemente sea lo más parecido a un subconjunto estandarizado.
Vea la sintaxis de expresiones regulares de emacs: http://www.gnu.org/software/emacs/manual/html_node/emacs/Regexps.html#Regexps.
Recuerdo haber leído que la sintaxis de emacs está escrita en piedra (por razones de compatibilidad con versiones anteriores), así que si quieres ser compatible con todo, haz que todo sea compatible con esto.Algunas herramientas pueden admitirlo, otras no.
Si bien tiene un objetivo digno, creo que será extremadamente difícil de alcanzar, y también me resulta complicado trabajar con las expresiones regulares de emacs.¿Quizás el 99% de todo es suficientemente bueno si te hace más feliz y productivo?