2014-01-16 52 views
2

如何比较两个不相等的模式,并获得位置 以下比较两个字符串:使用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>

感谢您的帮助提前。

+0

你想比较正则表达式,而不是使用正则表达式吗?看起来你要求RE之间的Levenshtein距离。看看那个。 – Barmar

+0

为什么原始模式中的''变成了结果中的''? – Barmar

+0

同时考虑作为一个字符串刚插入“”的标签不匹配,如果发现....就像任何工具比较突出的区别...所需的输出为“ \ d +。 PE/RL/\ w + 维韦克 \ w + “ – vivek

回答

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> 

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