There is a big comparison table in http://www.regular-expressions.info/refflavors.html.
Most of the basic elements are the same, the differences are:
Minor differences:
- Unicode escape sequences. In .NET it is
\u200A
, in Perl it is\x{200A}
. \v
in .NET is just the vertical tab (U+000B), in Perl it stands for the “vertical whitespace” class. Of course there is\V
in Perl because of this.- The conditional expression for named reference in .NET is
(?(name)yes|no)
, but(?(<name>)yes|no)
in Perl.
Some elements are Perl-only:
- Possessive quantifiers (
x?+
,x*+
,x++
etc). Use non-backtracking subexpression ((?>…)
) instead. - Named unicode escape sequence
\N{LATIN SMALL LETTER X}
,\N{U+200A}
. - Case folding and escaping
\l
(lower case next char),\u
(upper case next char).\L
(lower case),\U
(upper case),\Q
(quote meta characters) until\E
.
- Shorthand notation for Unicode property
\pL
and\PL
. You have to include the braces in .NET e.g.\p{L}
. - Odd things like
\X
,\C
. - Special character classes like
\v
,\V
,\h
,\H
,\N
,\R
- Backreference to a specific or previous group
\g1
,\g{-1}
. You can only use absolute group index in .NET. - Named backreference
\g{name}
. Use\k<name>
instead. - POSIX character class
[[:alpha:]]
. - Branch-reset pattern
(?|…)
\K
. Use look-behind ((?<=…)
) instead.- Code evaluation assertion
(?{…})
, post-poned subexpression(??{…})
. - Subexpression reference (recursive pattern)
(?0)
,(?R)
,(?1)
,(?-1)
,(?+1)
,(?&name)
. - Some conditional expression’s predicate are Perl-specific:
- code
(?{…})
- recursive
(R)
,(R1)
,(R&name)
- define
(DEFINE)
.
- code
- Special Backtracking Control Verbs
(*VERB:ARG)
- Python syntax
(?P<name>…)
. Use(?<name>…)
instead.(?P=name)
. Use\k<name>
instead.(?P>name)
. No equivalent in .NET.
Some elements are .NET only:
- Variable length look-behind. In Perl, for positive look-behind, use
\K
instead. - Arbitrary regular expression in conditional expression
(?(pattern)yes|no)
. - Character class subtraction (undocumented?)
[a-z-[d-w]]
- Balancing Group
(?<-name>…)
. This could be simulated with code evaluation assertion(?{…})
followed by a(?&name)
.
References: