正则表达式比较2个字符串直到第一个不匹配并输出匹配和不匹配的部分

时间:2013-10-04 15:11:34

标签: regex perl

假设我有2个字符串。

$file1_out="astra.abs ::nerve :  Costa.br_.cotAlev.ksaf.large.props.fault_check"
$file2_out="astra.abs ::nerve :  Costa.br_.cotBlev.ksaf.large.props.fault_check"

你可以看到唯一的区别是cotAlev&中的A和B. cotBlev在2个字符串中。我想比较它们并获得2个新变量

$part1="astra.abs ::nerve :  Costa.br_."
$part2=".ksaf.large.props.fault_check"
$var="cot_lev" ###removed the mismatching character

这是直到第一个不相等的单词并分成3个。如何在PERL中使用正则表达式

我是perl的新手,并在这里使用C中常见的循环概念来解决这个问题。我通过将字符串分成字符来比较每个字符串然后将它们组合成3个变量来实现这一点。但有人告诉我,有更简单的方法可以做到这一点。有很多比较要做,所以速度很重要......

2 个答案:

答案 0 :(得分:1)

看看Text::Diff,它可能会做你尝试做的事情。

答案 1 :(得分:1)

我不确定如何用正则表达式处理这个问题。你说你用C循环来处理这个问题。你可以在Perl中做类似的事情。

my @file1_chars = split //, $file1_out;
my @file2_chars = split //, $file2_out;

这会将您的字符串拆分为一个数组,数组中的每个条目都是一个单独的字符。现在你可以循环直到找到你第一个不匹配的角色:

my $first_mismatched;
for my $char_num ( (0..$#file1_chars) ) {
    if ( $file1_chars[$char_num] ne $file2_chars[$char_num] ) {
        $first_mismatched = $char_num;
    }
}
if ( defined $first_mismatched ) {
    say "The two strings stop matching on character # $first_mismatched";
}

这将打印出来:

The two strings stop matching on character # 34

$#file1_chars@file1_chars的最后一个数组索引。 (0..$#file1_chars)索引从第一个索引条目到最后一个索引条目@file1_chars

您可以将其反转为从最后一个字符转到第一个字符:

my $last_mismatched;
for my $char_num ( reverse (0..$#file1_chars) ) {
    if ( $file1_chars[$char_num] ne $file2_chars[$char_num] ) {
        $last_mismatched = $char_num;
    }
}
if ( defined $last_mismatched ) {
    say "The two strings restart matching on character # $first_mismatched";
}