Translate Perl regular expressions to .NET

.net, c#, perl, regex

Solution

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)`.

- 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:

- .NET Framework 4: Regular Expression Language Elements

- perlre

Problem

I have some useful regular expressions in Perl. Is there a simple way to translate them to .NET's dialect of regular expressions? If not, is there a concise reference of differences?

Original source