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

C# 将Perl正则表达式转换为.NET,c#,.net,regex,perl,C#,.net,Regex,Perl,我有一些有用的Perl语言。有没有一种简单的方法可以将它们转换成.NET的正则表达式方言 如果没有,是否有一个简明的差异参考?它们与Perl 5正则表达式有关。因此,Perl5正则表达式应该只在.NET中工作 您可以将一些RegexOptions翻译如下: [Flags] public enum RegexOptions { Compiled = 8, CultureInvariant = 0x200, ECMAScript = 0x100, ExplicitCapture =

我有一些有用的Perl语言。有没有一种简单的方法可以将它们转换成.NET的正则表达式方言

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

它们与Perl 5正则表达式有关。因此,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#中的所有转义字符:


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

查看.NETRegex备忘单,看看运营商是否做了您期望它做的事情


我不知道有什么工具可以自动在RegEx方言之间进行翻译。

中有一个很大的比较表


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

细微差别:

  • 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(
    (?@Eric:两者都不是另一个的超集。不,.NET在Perl 5之后,复制了它的正则表达式语法。@KennyTM=>Perl没有的东西是什么?Perl嵌入了代码执行
    (?{code})
    (?{code})
    ,递归到捕获组中…@Eric:@Eric:(1)那是作弊;)(2)我没有调用.NET是Perl的超集。我调用它们属于不同的集合(插入维恩图).RegexBuddy可以使用多种风格的regex并将其转换为另一种风格-只要目标regex风格支持所需的功能。太棒了,谢谢…顺便说一句,我对这两种方言的兼容性感到非常惊喜…甚至环顾四周,等等。我还不知道.NET支持中的regex.Replace方法orted替换匹配的括号子表达式($1,$2等),例如:str=Regex.Replace(str,@“([a-z]+):(\d+),m=>m.Result($1--$2)),它对应于Perl:s/([a-z]+):(\d+/$1--$2/g“某些元素仅限Perl”并没有提到字符转换(如tr/tgca/acgt/)很好的答案。我想补充一点。我想补充一点:当你在一个单一的正则表达式中混合命名和未命名的捕获组时,它们引用的顺序是不同的。在Perl,<代码> perl -e @捕获=`Word1 Word2 Word3′=~/((\\W+))s+(\W+)s+(\W+)/;(@captures){say$c}”
    仍然显示为
    word1 word2 word3
    ,而在.NET正则表达式中,它将显示为
    word2 word3 word1
    ,因为当正则表达式引擎对捕获组进行排序时,未命名的组会意外地按优先级排列。当复杂正则表达式从一种语言转换为另一种语言时,这可能会产生影响。
    string badOnTheEyesRx    = "\\d{4}/\\d{2}/\\d{2}";
    string easierOnTheEyesRx = @"\d{4}/\d{2}/\d{2}";