2010-08-05 16 views

Respuesta

31

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


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

diferencias menores:

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

Algunos elementos son de sólo Perl:

  • 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}.
  • plegable de la caja y escapar
    • \l (caso inferior siguiente char), \u (mayúsculas siguiente char).
    • \L (minúscula), \U (mayúscula), \Q (comillas metacaracteres) hasta \E.
  • Notación abreviada para la propiedad Unicode \pL y \PL. Debes incluir las llaves en .NET, p. Ej. \p{L}.
  • Cosas raras como \X, \C.
  • clases de caracteres especiales como \v, \V, \h, \H, \N, \R
  • retro-referencia a un grupo específico o anterior \g1, \g{-1}. Solo puede usar el índice de grupo absoluto en .NET.
  • Referencias referenciadas \g{name}. Use \k<name> en su lugar.
  • clase de caracteres POSIX [[:alpha:]].
  • Reinicio de rama modelo (?|…)
  • \K. Use look-behind ((?<=…)) en su lugar.
  • Aserción de evaluación de código (?{…}), subexpresión post-poned (??{…}).
  • referencia Subexpresiones (patrón recursivo) (?0), (?R), (?1), (?-1), (?+1), (?&name).
  • predicado de algunas expresiones regulares son Perl-específica:
    • código (?{…})
    • recursiva (R), (R1), (R&name)
    • definir (DEFINE).
  • especiales que se remontan hasta Verbos de control (*VERB:ARG) sintaxis
  • Python
    • (?P<name>…). Use (?<name>…) en su lugar.
    • (?P=name). Use \k<name> en su lugar.
    • (?P>name). Sin equivalente en .NET.

Algunos elementos son solamente .NET:

  • longitud variable aspecto subyacente. En Perl, para un look-behind positivo, use \K en su lugar.
  • Expresión regular arbitraria en la expresión condicional (?(pattern)yes|no).
  • resta de clase de caracteres (¿indocumentado?) [a-z-[d-w]]
  • Equilibrio Grupo (?<-name>…). Esto podría simularse con la afirmación de evaluación de código (?{…}) seguida de un (?&name).

Referencias:

+3

+1 Gran respuesta –

+0

Impresionante, gracias ... Por cierto, me sorprendió gratamente lo compatibles que son los 2 dialectos ... incluso la mirada, etc. Tampoco sabía que el método Regex.Replace en .NET admitió el reemplazo de subexpresiones entre paréntesis emparejadas ($ 1, $ 2, etc.) como así: str = Regex.Replace (str, @ "([az] +): (\ d +)", m => m.Result ("$ 1 - $ 2 ")) que corresponde a Perl: s/([az] +): (\ d +)/$ 1 - $ 2/g – JoelFan

+0

" Algunos elementos son Perl-only "no menciona la traducción de caracteres (como tr/tgca/acgt /), por lo que es compatible, ¿no? – mbx

2

Eran designed to be compatible con Perl 5 expresiones regulares. Como tal, Perl 5 regexes debería solo funcionar en .NET.

se puede traducir algunos RegexOptions de la 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 utilizar cadenas literales de manera que no es necesario para 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}"; 
+0

No soy experto en .NET, pero me imagino que su al revés ... –

+3

@Eric: Ninguno es un superconjunto del otro. – kennytm

+1

No, .NET apareció después de Perl 5 y copió su sintaxis de expresiones regulares ganadoras. –

1

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

Eche un vistazo a this .NET regex cheat sheet para ver si un operador hace lo que espera que haga.

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

+0

RegexBuddy puede tomar una expresión regular en una gran variedad de sabores y convertirla en otra, siempre que la funcionalidad requerida sea compatible con el sabor regex objetivo . –

Cuestiones relacionadas