2012-10-05 21 views
10

Estoy haciendo esta pregunta porque noto que hay algunas diferencias leves en la sintaxis de RegEx entre diferentes idiomas. Me pregunto si existe un estándar RegEx que se mantenga en algún lugar. Y si es así, ¿dónde puedo encontrar este documento? Además, si creo una expresión RegEx en .NET, ¿se garantiza que la misma expresión sea 100% compatible y trabaje con otros lenguajes, como Perl o Javascript o Java? Finalmente, ¿hay alguna "mejores prácticas" cuando se trata de usar RegEx que puede ayudar a que sea más fácil de mantener en otros lenguajes de plataforma?Estándares RegEx en todos los idiomas

Respuesta

11

Uno de los conjuntos más antiguos de expresiones regulares estandarizadas es el POSIX BRE (expresiones regulares básicas) y ERE (expresiones regulares extendidas), documentado en Regular Expressions.

Otros idiomas pueden definir sus propios estándares. Por ejemplo, C++ 2011 tiene una biblioteca de expresiones regulares definida en la cláusula 28 (alrededor de 46 páginas de estándar). Perl define sus expresiones regulares. Otros idiomas toman prestado de estas fuentes y otras. Lex y Flex usan su propio conjunto de expresiones regulares. Sed usa su propia variante en expresiones regulares. Y Java, JavaScript y ... definen sus propias versiones, a veces usando PCRE (Perl-Compatible Regular Expressions) como base para su diseño. Algunos de los detalles se ven afectados por las facilidades proporcionadas por el idioma en el que se utilizan las expresiones regulares.

El libro de Jeff Friedl Mastering Regular Expressions abarca una gran cantidad de conjuntos diferentes de expresiones regulares, identificando lo que es común y lo que es diferente.

+0

Ha votado para la referencia al libro de Friedl. – jlmcdonald

+3

+1 para el libro de Jeff Friedl. También consulte Eche un vistazo a http://en.wikipedia.org/wiki/Comparison_of_regular_expression_engines para una comparación. Para la mayoría de los propósitos prácticos, espero que sus expresiones regulares .Net, Java y Perl sean compatibles. Si sus expresiones regulares son complejas, puede tener problemas (como recursividad). –

+0

JavaScript y Java implementan un subconjunto de PCRE, con JS implementa un subconjunto más pequeño. – nhahtdh

0

No, no existe tal estándar. Por supuesto hay PCRE, POSIX BRE, POSIX ERE, ...

Pero de hecho habrá diferencias "pequeñas" en cualquier idioma. Puede transmitir cosas muy básicas para la mayoría de los sabores, como el . para cualquier carácter o los cuantificadores +*?, las clases de caracteres también son comunes, pero ya comienza en clases predefinidas como \w, ¿es compatible? o basado en ASCII o Unicode?

Una buena ayuda aquí es el flavor comparison on regular-expressions.info por Jan Goyvaerts.

0

Buenas Prácticas

Evitar el uso de positive-negative lookbehinds y en algunos casos lookaheads

+0

¿Por qué evitarías lookaheads y solo en algunos casos mirar hacia atrás? Hay muchas más limitaciones en el soporte de lookbehind en todos los idiomas que para lookaheads. – stema

+0

@stema ohh ... lo siento, me confundí entre ellos ... por apuntar – Anirudha

Cuestiones relacionadas