C# 将Perl正则表达式转换为.NET
我有一些有用的Perl语言。有没有一种简单的方法可以将它们转换成.NET的正则表达式方言 如果没有,是否有一个简明的差异参考?它们与Perl 5正则表达式有关。因此,Perl5正则表达式应该只在.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 =
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中是
,在Perl中是\u200A
\x{200A}
- .NET中的
只是垂直选项卡(U+000B),在Perl中它代表“垂直空白”类。当然,Perl中也有\v
,正因为如此\V
- NET中命名引用的条件表达式是
,但在Perl中是(?(name)yes | no)
李>(?()yes | no)
- 所有格量词(
,x++
,x*++
等)。改用非回溯子表达式(x++
)(?>…)
- 命名的unicode转义序列
,\N{LATIN SMALL LETTER X}
\N{U+200A}
- 箱子折叠和逃逸
(小写下一个字符)、\l
(大写下一个字符)\u
(小写)、\L
(大写)、\U
(引用元字符)直到\Q
\E
- Unicode属性
和\pL
的简写符号。您必须在.NET中包含大括号,例如\pL
\p{L}
- 奇怪的事情,比如
,\X
\C
- 特殊字符类,如
,\v
,\v
,\h
,\h
,\N
\R
- 对特定或先前组的反向引用
,\g1
。您只能在.NET中使用绝对组索引\g{-1}
- 命名反向引用
。改用\g{name}
\k
- POSIX字符类
[:alpha:]
- 分支重置模式
(?|…)
。使用look behind(\K
仍然显示为(?@Eric:两者都不是另一个的超集。不,.NET在Perl 5之后,复制了它的正则表达式语法。@KennyTM=>Perl没有的东西是什么?Perl嵌入了代码执行
和(?{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}”(?{code})
,而在.NET正则表达式中,它将显示为word1 word2 word3
,因为当正则表达式引擎对捕获组进行排序时,未命名的组会意外地按优先级排列。当复杂正则表达式从一种语言转换为另一种语言时,这可能会产生影响。word2 word3 word1
string badOnTheEyesRx = "\\d{4}/\\d{2}/\\d{2}"; string easierOnTheEyesRx = @"\d{4}/\d{2}/\d{2}";