代码之家  ›  专栏  ›  技术社区  ›  JoelFan

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

  •  19
  • JoelFan  · 技术社区  · 15 年前

    我有一些有用的 regular expressions 在Perl。有没有一种简单的方法可以将它们翻译成.NET的正则表达式方言?

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

    3 回复  |  直到 11 年前
        1
  •  32
  •   kennytm    15 年前

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


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

    细微差别:

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

    有些元素只是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<name> 相反。
    • POSIX字符类 [[:alpha:]] .
    • 分支重置模式 (?|…)
    • \K . 使用后视镜( (?<=…) 相反。
    • 代码评估断言 (?{…}) ,后置子表达式 (??{…}) .
    • 子表达式引用(递归模式) (?0) , (?R) , (?1) , (?-1) , (?+1) , (?&name) .
    • 某些条件表达式的谓词是特定于Perl的:
      • 代码 ?{ }{})
      • 递归的 (R) , (R1) , (R&name)
      • 定义 (DEFINE) .
    • 特殊回溯控制动词 (*VERB:ARG)
    • Python语法
      • (?P<name>…) . 使用 (?<name>…) 相反。
      • (?P=name) . 使用 K&L.No.gt; 相反。
      • (?P>name) . .NET中没有等效项。

    某些元素仅为.NET:

    • 变长后看。在Perl中,要获得积极的支持,请使用 K 相反。
    • 条件表达式中的任意正则表达式 (?(pattern)yes|no) .
    • 字符类减法(未记录?) [a-z-[d-w]]
    • 平衡组 (?<-name>…) . 这可以用代码评估断言来模拟 ?{ }{}) 其次是 ?名称; .

    参考文献:

        2
  •  2
  •   Jordão    15 年前

    他们是 designed to be compatible 使用Perl5正则表达式。因此,Perl5正则表达式 应该 只需在.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}";
    
        3
  •  1
  •   Oded    15 年前

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

    看一看 this .NET regex备忘表,查看操作员是否按预期执行操作。

    我不知道有什么工具可以在regex方言之间自动转换。