I have some useful regexes in Perl. Is there a simple way to translate them to .NET's dialect of regex? If not, is there a concise reference of differences?
They were designed to be compatible with Perl 5 regexes. As such, Perl 5 regexes should just work in .NET.
You can translate some RegexOptions as follows:
[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
}
Another tip is to use verbatim strings so that you don't need to escape all those escape characters in C#:
string badOnTheEyesRx    = "\\d{4}/\\d{2}/\\d{2}";
string easierOnTheEyesRx = @"\d{4}/\d{2}/\d{2}";
It really depends on the complexity of the regular expression - many ones will work the same out of the box.
Take a look at this .NET regex cheat sheet to see if an operator does what you expect it to do.
I don't know of any tool that automatically translates between RegEx dialects.
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}.
- \vin .NET is just the vertical tab (U+000B), in Perl it stands for the "vertical whitespace" class. Of course there is- \Vin 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 \pLand\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 \Kinstead.
- 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: