[英]Perl: Matching 3 pairs of numbers from 4 consecutive numbers
我正在編寫一些代碼,我需要執行以下操作:
給定一個4位數字,例如“ 1234”,我需要獲得3對數字(前2個,中間2個,最后2個),在此示例中,我需要獲得“ 12”,“ 23”和“ 34” ”。
我是perl的新手,對regex一無所知。 實際上,我正在編寫一個供個人使用的腳本,幾天前我開始閱讀有關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++;
}
}
謝謝。
您可以使用pos()
移動最后一個匹配位置
pos直接訪問正則表達式引擎用於存儲偏移量的位置,因此分配給pos將更改該偏移量。
my $item = 1234;
my @arr;
while ($item =~ /(\d\d)/g) {
push @arr, $1;
pos($item)--;
}
print "@arr\n"; # 12 23 34
最簡單的方法是使用全局正則表達式模式搜索
幾乎總是最好將輸入數據的驗證與處理分開,因此下面的程序首先拒絕所有長度不超過四個字符或包含非數字字符的值
然后,正則表達式模式會找到字符串中所有后跟兩位數字的點,並捕獲它們
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
這是一個非常響亮的示例,展示了如何使用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
foreach $item (@totaldata) {
if ( my @match = $item =~ m/(?=(\d\d))/ ) {
($heads[$i], $middles[$i], $tails[$i]) = @match;
$processednums++;
$i++;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.