正则表达式最接近的匹配数字

时间:2016-03-14 13:51:25

标签: regex perl

我有一个数字列表
4
44个
4420
44208个
442082个
4420820个
44208202个
4420820205个
44208202057
442082020579

现在我有号码442082020987,如何才能获得正则表达式搜索以找到最接近的匹配?

44→2→0→8→2→0→2→0→5→7→9→给了我所有这些,有没有办法显示最接近的匹配?

感谢

2 个答案:

答案 0 :(得分:3)

正则表达式确实是这项工作的错误工具 - 正则表达式是关于匹配模式的。你正在做的任务......不是。

尝试不同的方法,例如使用Text::Levenshtein进行比较:

#!/usr/bin/env perl
use strict;
use warnings;
use Text::Levenshtein qw/ distance /;

my $search = '442082020987';

while ( <DATA> ) {
    chomp;
    print distance ( $search, $_ ), "=>", $_,"\n";
}

__DATA__
4
44
4420
44208
442082
4420820
44208202
4420820205
44208202057
442082020579

输出:

11=>4
10=>44
8=>4420
7=>44208
6=>442082
5=>4420820
4=>44208202
3=>4420820205
2=>44208202057
3=>442082020579

我会留给您选择最小值,假设:“2 => 44208202057”是您的方案的正确答案。

或者您可以进行数字比较 - 但这些看起来像电话号码,因此基于字符串的匹配可能是合适的。

答案 1 :(得分:3)

我认为这是来自List::UtilsBy模块

nmin_by的情况
use strict;
use warnings 'all';
use feature 'say';

use List::UtilsBy 'nmin_by';

chomp( my @data = <DATA> );

my $target = 442082020987;

say nmin_by { abs($_ - $target) } @data;

__DATA__
4
44
4420
44208
442082
4420820
44208202
4420820205
44208202057
442082020579

输出

442082020579

如果您希望避免使用该模块,那么这将完成工作。输出与第一个解决方案相同

for my $n ( @data ) {
    my $delta = abs($n - $target);
    unless ( defined $min_delta and $min_delta <= $delta ) {
        ($nearest, $min_delta) = ($n, $delta);
    }
}

say $nearest;