如何比较两个不相等的模式并获得位置 对于以下内容:
拍1:<start>\d+.\d+/\w+\_\w+<end>
拍2:<start>\d+.pe/rl/\w+vivek\w+<end>
我希望输出为
<starttag>\d+.<NOT>pe/rl</NOT>/\w+<NOT>vivek</NOT>\w+<endtag>
感谢您的帮助。
答案 0 :(得分:1)
听起来你希望输出包含两种模式中的所有内容,加上NOT标签中的任何内容都只是在第二种模式中?您的示例与此略有不同(例如starttag
而不是start
,<startvivek>
而不是<start>vivek
)。但假设我是对的:
use strict;
use warnings;
use Algorithm::Diff;
my $one = '<start>\d+.\d+/\w+\_\w+<end>';
my $two = '<start>\d+.pe/rl/\w+vivek\w+<end>';
my $diff = Algorithm::Diff->new( [ split //, $one ], [ split //, $two ] );
my $combined = '';
while ( $diff->Next() ) {
if ( $diff->Same() ) {
$combined .= join '', $diff->Same();
}
elsif ( $diff->Items(2) ) {
$combined .= join '', '<NOT>', $diff->Items(2), '</NOT>';
}
}
print "$combined\n";
输出:
<start>\d+.<NOT>pe</NOT>/<NOT>rl/</NOT>\w+<NOT>vivek</NOT>\w+<end>
因为它选择考虑第一个模式中的/匹配第二个模式中的第一个/而不是第二个模式中的/。