[英]Translate Perl regular expressions to .NET
http://www.regular-expressions.info/refflavors.html中有一个很大的比较表。
大多数基本元素相同,区别在于:
细微差异:
\
,在Perl中是\\x{200A}
。 \\v
只是垂直制表符(U + 000B),在Perl中代表“垂直空格”类。 因此,Perl中有\\V
(?(name)yes|no)
,但在Perl中为(?(<name>)yes|no)
。 一些元素仅适用于Perl:
x?+
, x*+
, x++
等)。 改用非回溯子表达式( (?>…)
)。 \\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}";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.