2008-08-27 16 views
9

He visto muchas cosas en común en las capacidades regex de diferentes herramientas/idiomas habilitados para expresiones regulares (por ejemplo, perl, sed, java, vim, etc.), pero también tengo muchas diferencias.Características comunes a todos los sabores regex?

¿Existe un estándar subconjunto de capacidades de expresiones regulares compatibles con todas las herramientas/idiomas habilitados para expresiones regulares? ¿Cómo varían las capacidades de expresiones regulares entre herramientas/idiomas?

Respuesta

1

Si tomó la gramática grep expresión regular, no el egrep uno, o la gramática de expresiones regulares sed y utilizó ese deberías estar usando un subconjunto seguro en muchas plataformas y herramientas.

Lo único que puede morderte entonces es cuando cambias entre las implementaciones de expresiones regulares usando Automatizaciones de estado finito (FSA) y las que usan retroceso, p. Ej. las implementaciones del cuantificador 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 retroceden encontrarán la primera coincidencia sesgada hacia la izquierda, comenzando en la primera posición posible. Es decir, probará cada rama en el orden del patrón hasta que se encuentre una coincidencia.

Considere la cadena "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 seguimiento posterior coincidirán con la primera subcadena sesgada a la izquierda, "xyxyxy".

+0

"autómata de decisión no finito". Mi computadora solo tiene memoria finita; ¿cómo tiene un infinito $ THING? Creo que podría querer decir s/finite/deterministic/g. –

1

mayoría de las herramientas de expresiones regulares/soporte de lenguajes de estos basic capabilities:

  1. carácter Clases/Sets y su negación - []
  2. Anclas -^$
  3. Alternancia - |
  4. Cuantificadores -? + * {N, m}
  5. Metacaracteres - \ w, \ s, \ d, ...
  6. referencias hacia atrás - \ 1, \ 2, ...
  7. Dot -.
  8. modificadores simples como/gy/i for global e ignorar caso
  9. Caracteres Escapar

Más herramientas avanzadas/soporte de lenguajes:

  1. búsquedas hacia delante y traseros
  2. clases de caracteres POSIX
  3. Límites de palabras
  4. Interruptores en línea como permitir la inserción de casos nsitivity por sólo una pequeña parte de la expresión regular
  5. como modificadores/x para permitir formatear y comentarios extra/m para multilínea
  6. Named Captura
  7. Unicode
+2

Algunas implementaciones simples (por ejemplo, en Scintilla/SciTE) ni siquiera admiten la alternancia o algunos cuantificadores (? Y {}). – PhiLho

0

No hay motor estándar. Sin embargo, el formato POSIX de expresión regular extendida es un subconjunto válido de la mayoría de los motores y probablemente esté lo más cerca posible de un subconjunto estandarizado.

0

Ver la sintaxis de expresiones regulares de emacs: http://www.gnu.org/software/emacs/manual/html_node/emacs/Regexps.html#Regexps.

Recuerdo leer que la sintaxis de emacs es inamovible (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 ser compatibles, otras no.

Si bien tiene un objetivo digno, creo que será extremadamente difícil de alcanzar, y también he encontrado que las expresiones regulares de emacs son un dolor para trabajar. ¿Tal vez el 99% de todo es lo suficientemente bueno si te hace más feliz y más productivo?

Cuestiones relacionadas