Tengo algunos regular expressions útiles en Perl. ¿Hay alguna forma sencilla de traducirlos al dialecto de expresiones regulares de .NET?Traducir expresiones regulares de Perl a .NET
Si no, ¿hay una referencia concisa de las diferencias?
Tengo algunos regular expressions útiles en Perl. ¿Hay alguna forma sencilla de traducirlos al dialecto de expresiones regulares de .NET?Traducir expresiones regulares de Perl a .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.
mayoría de los elementos básicos son los mismos, las diferencias son:
diferencias menores:
\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.(?(name)yes|no)
, pero (?(<name>)yes|no)
en Perl.Algunos elementos son de sólo Perl:
x?+
, x*+
, x++
etc). En su lugar, utilice una subexpresión que no sea de retroceso ((?>…)
).\N{LATIN SMALL LETTER X}
, \N{U+200A}
.\l
(caso inferior siguiente char), \u
(mayúsculas siguiente char).\L
(minúscula), \U
(mayúscula), \Q
(comillas metacaracteres) hasta \E
.\pL
y \PL
. Debes incluir las llaves en .NET, p. Ej. \p{L}
.\X
, \C
.\v
, \V
, \h
, \H
, \N
, \R
\g1
, \g{-1}
. Solo puede usar el índice de grupo absoluto en .NET.\g{name}
. Use \k<name>
en su lugar.[[:alpha:]]
.(?|…)
\K
. Use look-behind ((?<=…)
) en su lugar.(?{…})
, subexpresión post-poned (??{…})
.(?0)
, (?R)
, (?1)
, (?-1)
, (?+1)
, (?&name)
.(?{…})
(R)
, (R1)
, (R&name)
(DEFINE)
.(*VERB:ARG)
sintaxis(?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:
\K
en su lugar.(?(pattern)yes|no)
.[a-z-[d-w]]
(?<-name>…)
. Esto podría simularse con la afirmación de evaluación de código (?{…})
seguida de un (?&name)
.Referencias:
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}";
No soy experto en .NET, pero me imagino que su al revés ... –
@Eric: Ninguno es un superconjunto del otro. – kennytm
No, .NET apareció después de Perl 5 y copió su sintaxis de expresiones regulares ganadoras. –
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.
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 . –
+1 Gran respuesta –
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
" Algunos elementos son Perl-only "no menciona la traducción de caracteres (como tr/tgca/acgt /), por lo que es compatible, ¿no? – mbx