Perl:匹配4个连续数字中的3对数字

时间:2016-04-30 05:00:48

标签: regex perl

我正在编写一些代码,我需要执行以下操作:

给出4位数字,例如" 1234"我需要得到3对数字(前2个,中间2个,最后2个),在这个例子中我需要得到" 12" " 23"和" 34"。

我是perl的新手并且对正则表达式一无所知。事实上,我正在编写一个供个人使用的脚本,我几天前开始阅读有关Perl的内容,因为我认为这对于手头的任务来说是一个更好的语言(需要对数字和找到模式)

我有以下代码,但在测试时我处理了6位数字,因为我忘了"我要处理的数字是4位数,所以当时数据失败了,当然

foreach $item (@totaldata)
{
    my $match;

    $match = ($item =~ m/(\d\d)(\d\d)(\d\d)/);

    if ($match) 
    { 
    ($arr1[$i], $arr2[$i], $arr3[$i]) = ($item =~ m/(\d\d)(\d\d)(\d\d)/);
    $processednums++; 
    $i++;
    }
}

谢谢。

4 个答案:

答案 0 :(得分:4)

您可以使用pos()

移动最后一个匹配位置
  

pos直接访问regexp引擎用来存储偏移量的位置,因此分配给pos将改变该偏移量。

my $item = 1234;

my @arr;
while ($item =~ /(\d\d)/g) {
  push @arr, $1;
  pos($item)--;
}
print "@arr\n"; # 12 23 34

答案 1 :(得分:2)

最简单的方法是使用全局正则表达式模式搜索

将输入数据的验证处理分开几乎总是最好的,因此下面的程序首先拒绝任何不是四个字符长的值或包含非数字字符

然后正则表达式模式找到字符串中后跟两位数的所有点,并捕获它们

use strict;
use warnings 'all';

for my $val ( qw/ 1234 6572 / ) {

    next if length($val) != 4 or $val =~ /\D/;

    my @pairs = $val =~ /(?=(\d\d))/g;
    print "@pairs\n";
}

输出

12 23 34
65 57 72

答案 2 :(得分:1)

这是一个非常响亮的例子,演示了如何使用substr()来获取数字的部分,同时确保您所处理的内容实际上恰好是一个四位数字。

use warnings;
use strict;

my ($one, $two, $three);

while (my $item = <DATA>){
    if ($item =~ /^\d{4}$/){
        $one   = substr $item, 0, 2;
        $two   = substr $item, 1, 2;
        $three = substr $item, 2, 2;
        print "one: $one, two: $two, three: $three\n";
    }
}

__DATA__
1234
abcd
a1b2c3
4567
891011

输出:

one: 12, two: 23, three: 34
one: 45, two: 56, three: 67

答案 3 :(得分:1)

foreach $item (@totaldata) {
    if ( my @match = $item =~ m/(?=(\d\d))/ ) {
        ($heads[$i], $middles[$i], $tails[$i]) = @match;
        $processednums++; 
        $i++;
    }
}