为什么C#和Perl的正则表达式结果不同?

时间:2017-11-22 09:23:23

标签: c# regex perl

在C#代码之后,我将perl代码重新创建为C#。 它是相同的正则表达式,但其结果是不同的。 Perl代码被捕获" a"但是C#代码被捕获了#34; apple"。 是什么让它与众不同?

C#代码

string word = Regex.Replace("apple", "(?<C>a(?=pple)|b(?=anana)|c(?=herry))", "${C}");

Console.WriteLine("fruit\'s initial: {0}", word); // result: "fruit's initial: apple"

Perl代码

my $word = 'apple';

if ($word =~ /(?<C>a(?=pple)|b(?=anana)|c(?=herry))/) {
print "fruit\'s initial: $+{C}"; // result: "fruit's initial: a"
}

1 个答案:

答案 0 :(得分:8)

在Perl中,您匹配并捕获了第一个a,后跟pple到了“C”组,然后将其打印出来。在C#中,您使用a替换了pple,然后替换为a,结果导致apple未更改。

改为使用匹配:

var m = Regex.Match("apple", "(?<C>a(?=pple)|b(?=anana)|c(?=herry))");
if (m.Success)
{
    Console.WriteLine("fruit\'s initial: {0}", m.Groups["C"].Value);
}

请参阅C# demo

此处,正则表达式匹配分配给m变量。如果匹配发生(if (m.Success)),您可以使用m.Groups["C"].Value获得组“C”值。