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?

¿Fue útil?

Solución

Comparar sabores de expresión regular

http://www.regular-expressions.info/refflavors.html

Otros consejos

La mayoría de las herramientas/lenguajes de expresión regular admiten estos capacidades básicas:

  1. Clases/conjuntos de caracteres y su negación - []
  2. Anclas - ^$
  3. Alternancia - |
  4. Cuantificadores - ?+*{n,m}
  5. Metacaracteres: \w, \s, \d, ...
  6. Referencias anteriores: \1, \2, ...
  7. Punto - .
  8. Modificadores simples como /g y /i para global e ignorar mayúsculas y minúsculas
  9. Personajes que escapan

Soporte de herramientas/idiomas más avanzados:

  1. Mirando hacia adelante y hacia atrás
  2. clases de caracteres POSIX
  3. Límites de palabras
  4. 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
  5. Modificadores como /x para permitir formato y comentarios adicionales, /m para varias líneas
  6. Capturas nombradas
  7. 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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top