使用perl正则表达式比较两个字符串

时间:2014-01-16 05:10:19

标签: regex perl

如何比较两个不相等的模式并获得位置 对于以下内容:

拍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>

感谢您的帮助。

1 个答案:

答案 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>

因为它选择考虑第一个模式中的/匹配第二个模式中的第一个/而不是第二个模式中的/。