将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方言的工具。