Traduzca expresiones regulares de Perl a .NET

Tengo algunas expresiones regulares útiles en Perl. ¿Hay alguna forma sencilla de traducirlos al dialecto de expresiones regulares de .NET?

Si no, ¿hay una referencia concisa de las diferencias?

Hay una gran tabla de comparación en http://www.regular-expressions.info/refflavors.html .


La mayoría de los elementos básicos son iguales, las diferencias son:

Diferencias menores:

  • Secuencias de escape Unicode. En .NET es, en Perl es \x{200A} .
  • \v en .NET es solo la pestaña vertical (U + 000B), en Perl representa la clase “espacio en blanco vertical”. Por supuesto, hay \V en Perl debido a esto.
  • La expresión condicional para referencia nombrada en .NET es (?(name)yes|no) , pero (?()yes|no) en Perl.

Algunos elementos son solo Perl:

  • Los cuantificadores posesivos ( x?+ , x*+ , x++ etc.). En su lugar, utilice una subexpresión que no sea de retroceso ( (?>…) ).
  • Secuencia de escape unicode con nombre \N{LATIN SMALL LETTER X} , \N{U+200A} .
  • Caso de plegado y escape
    • \l (minúscula siguiente carácter), \u (mayúscula siguiente carácter).
    • \L (minúsculas), \U (mayúsculas), \Q (comillas metacaracteres) hasta \E
  • Notación abreviada para propiedades Unicode \pL y \PL . Debes incluir las llaves en .NET, por ejemplo, \p{L} .
  • Cosas raras como \X , \C
  • Clases de caracteres especiales como \v , \V , \h , \H , \N , \R
  • Referencia a un grupo específico o previo \g1 , \g{-1} . Solo puede usar el índice de grupo absoluto en .NET.
  • Nombrada referencia inversa \g{name} . Use \k lugar.
  • Clase de caracteres POSIX [[:alpha:]] .
  • Patrón de restablecimiento de twig (?|…)
  • \K Use look-behind ( (?<=…) ) en su lugar.
  • Aserción de evaluación de código (?{…}) , subexpresión post-poned (??{…}) .
  • Referencia de subexpresión (patrón recursivo) (?0) , (?R) , (?1) , (?-1) , (?+1) , (?&name) .
  • Algunos predicados de expresiones condicionales son específicos de Perl:
    • código (?{…})
    • recursivo (R) , (R1) , (R&name)
    • define (DEFINE) .
  • Verbos especiales de control de retroceso (*VERB:ARG)
  • Sintaxis de Python
    • (?P…) . Use (?…) lugar.
    • (?P=name) . Use \k lugar.
    • (?P>name) . Sin equivalente en .NET.

Algunos elementos son solo .NET:

  • Longitud variable mirada atrás. En Perl, para un look-behind positivo, use \K lugar.
  • Expresión regular arbitraria en expresión condicional (?(pattern)yes|no) .
  • ¿Substracción de clase de carácter (indocumentado?) [az-[dw]]
  • Grupo de equilibrio (?<-name>…) . Esto podría simularse con una aserción de evaluación de código (?{…}) seguida de un (?&name) .

Referencias

  • .NET Framework 4: Elementos del lenguaje de expresiones regulares
  • perlre

Fueron diseñados para ser compatibles con Perl 5 expresiones regulares. Como tal, Perl 5 expresiones regulares debería funcionar en .NET.

Puede traducir algunas RegexOptions siguiente manera:

 [Flags] public enum RegexOptions { Compiled = 8, CultureInvariant = 0x200, ECMAScript = 0x100, ExplicitCapture = 4, IgnoreCase = 1, // i in Perl IgnorePatternWhitespace = 0x20, // x in Perl Multiline = 2, // m in Perl None = 0, RightToLeft = 0x40, Singleline = 0x10 // s in Perl } 

Otro consejo es usar cadenas verbatim para que no tenga que escapar de todos esos caracteres de escape en C #:

 string badOnTheEyesRx = "\\d{4}/\\d{2}/\\d{2}"; string easierOnTheEyesRx = @"\d{4}/\d{2}/\d{2}"; 

Realmente depende de la complejidad de la expresión regular; muchos de ellos funcionarán de la misma manera.

Eche un vistazo a esta hoja de información regex de .NET para ver si un operador hace lo que espera que haga.

No conozco ninguna herramienta que traduzca automáticamente entre dialectos RegEx.