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

Joe*_*Fan 19 .net c# regex perl

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

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

ken*_*ytm 34

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


大多数基本要素是相同的,不同之处是:

细微差别:

  • Unicode转义序列.在.NET中\u200A,在Perl中它是\x{200A}.
  • \v在.NET中只是垂直选项卡(U + 000B),在Perl中它代表"垂直空白"类.当然\V,Perl就是因为这个.
  • .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.请改用look-behind((?<=…)).
  • 代码评估断言(?{…}),后构建子表达式(??{…}).
  • 子表达式引用(递归模式)(?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).
  • 字符类减法(未记录?) [a-z-[d-w]]
  • 平衡集团(?<-name>…).这可以通过代码评估断言(?{…})然后用a 来模拟(?&name).

参考文献:

  • 太棒了,谢谢...顺便说一句,我对这两种方言的兼容性感到非常惊喜...甚至环视等等。我也不知道 .NET 中的 Regex.Replace 方法支持替换匹配的括号子表达式( $1、$2 等),如下所示: str = Regex.Replace(str, @"([az]+):(\d+)", m =&gt; m.Result("$1 -- $2")) 对应对于 Perl: s/([az]+):(\d+)/$1 -- $2/g (2认同)