繁体   English   中英

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

[英]Translate Perl regular expressions to .NET

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

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

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


大多数基本元素相同,区别在于:

细微差异:

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

一些元素仅适用于Perl:

  • 所有格量词( x?+x*+x++等)。 改用非回溯子表达式( (?>…) )。
  • 命名为unicode转义序列\\N{LATIN SMALL LETTER X}\\N{U+200A}
  • 案件折叠和逃脱
    • \\l (小写的下一个字符), \\u\u003c/code> (大写的下一个字符)。
    • \\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<name>
    • (?P>name) .NET中没有等效项。

某些元素仅是.NET:

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

参考文献:

它们被设计为与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备忘单,看看操作员是否按照您的期望去做。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM