将Perl正则表达式转换为.NET

我在Perl中有一些有用的正则表达式 。 有没有一种简单的方法将它们转换为.NET的正则表达式方言?

如果没有,是否有简明的差异参考?

http://www.regular-expressions.info/refflavors.html中有一个很大的比较表。


大多数基本要素是相同的,区别在于:

细微差别:

  • Unicode转义序列。 在.NET中它是\u200A ,在Perl中它是\x{200A}
  • .NET中的\v只是垂直选项卡(U + 000B),在Perl中它代表“垂直空白”类。 当然,因为这个,Perl中有\V
  • .NET中命名引用的条件表达式是(?(name)yes|no) ,但Perl中的(?()yes|no)

有些元素只是Perl:

  • 占有量词( x?+x*+x++等)。 使用非回溯子表达式( (?>…) )代替。
  • 命名为unicode转义序列\N{LATIN SMALL LETTER X}\N{U+200A}
  • 表壳折叠和逃逸
    • \l (小写下一个字符), \u (大写下一个字符)。
    • \L (小写), \U (大写), \Q (引用元字符)直到\E
  • Unicode属性\pL\PL简写表示法。 您必须在.NET中包含大括号,例如\p{L}
  • 奇怪的事情,如\X\C
  • 特殊字符类,如\v\V\h\H\N\R
  • 反向引用特定或以前的组\g1\g{-1} 。 您只能在.NET中使用绝对组索引。
  • 命名为反向引用\g{name} 。 请改用\k
  • POSIX字符类[[:alpha:]]
  • 分支重置模式(?|…)
  • \K 使用look-behind( (?<=…) )代替。
  • 代码评估断言(?{…}) ,后构建子表达式(??{…})
  • Subexpression参考(递归模式) (?0)(?R)(?1)(?-1)(?+1)(?&name)
  • 一些条件表达式的谓词是Perl特定的:
    • 代码(?{…})
    • 递归(R)(R1)(R&name)
    • 定义(DEFINE)
  • 特殊回溯控制动词(*VERB:ARG)
  • Python语法
    • (?P…) 。 请改用(?…)
    • (?P=name) 。 请改用\k
    • (?P>name) 。 在.NET中没有等价物。

有些元素只是.NET:

  • 可变长度的后视。 在Perl中,对于积极的后视,请使用\K
  • 条件表达式中的任意正则表达式(?(pattern)yes|no)
  • 字符类减法(未记录?) [az-[dw]]
  • 平衡组(?<-name>…) 。 这可以使用代码评估断言(?{…})然后是(?&name)来模拟。

参考文献:

  • .NET Framework 4:正则表达式语言元素
  • perlre

它们被设计为与Perl 5正则表达式兼容 。 因此,Perl 5正则表达式应该只适用于.NET。

您可以按如下方式翻译一些RegexOptions

 [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 } 

另一个提示是使用逐字字符串,这样您就不需要在C#中转义所有转义字符:

 string badOnTheEyesRx = "\\d{4}/\\d{2}/\\d{2}"; string easierOnTheEyesRx = @"\d{4}/\d{2}/\d{2}"; 

它实际上取决于正则表达式的复杂性 – 许多都可以开箱即用。

看看这个 .NET正则表达式备忘单,看看运营商是否做了你期望它做的事情。

我不知道任何自动翻译RegEx方言的工具。