在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"
}
答案 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”值。