Perl - 如何匹配不完全相同的字符串?

Sla*_*ron 3 regex string perl

我有一个我想在文件中找到的字符串列表.如果列表中和文件中的字符串完全匹配,这将非常简单.不幸的是,名称上存在拼写错误和变体.以下是其中一些字符串有所不同的示例

List          File
B-Arrestin    Beta-Arrestin
Becn-1        BECN 1
CRM-E4        CRME4
Run Code Online (Sandbox Code Playgroud)

请注意,尽管是不同的字符串,但每个对都应算作匹配.我知道我可以对各种变化进行分类,并编写单独的REGEX来识别匹配,但这很麻烦,我可能最好手动寻找匹配.我认为我的问题的最佳解决方案是某种表达方式:

"完全匹配此字符串,但如果有不匹配的X字符,则仍将其视为匹配"

这样的事情存在吗?是否有另一种方法来匹配不完全相同但接近的字符串?

Thi*_*Not 5

正如200_success指出的那样,你可以进行模糊匹配Text::Fuzzy,它可以计算文本位之间的Levenshtein距离.您将必须使用您想要允许的最大Levenshtein距离,但如果您进行不区分大小写的比较,则样本数据中的最大距离为三:

use strict;
use warnings;
use 5.010;

use Text::Fuzzy;

my $max_dist = 3;

while (<DATA>) {
    chomp;
    my ($string1, $string2) = split ' ', $_, 2;

    my $tf = Text::Fuzzy->new(lc $string1);
    say "'$string1' matches '$string2'" if $tf->distance(lc $string2) <= $max_dist;
}

__DATA__
B-Arrestin    Beta-Arrestin
Becn-1        BECN 1
CRM-E4        CRME4
Run Code Online (Sandbox Code Playgroud)

输出:

'B-Arrestin' matches 'Beta-Arrestin'
'Becn-1' matches 'BECN 1'
'CRM-E4' matches 'CRME4'
Run Code Online (Sandbox Code Playgroud)