一千萬個為什麽

搜索

當數字以0結尾時,為什麽我的正則表達式失敗?


這是一個非常基本的正則表達式問題,但由於我似乎無法弄清楚為什麽匹配在某些情況下失敗,我想我會發布它,看看是否有其他人可以指出我缺少的東西。

我試圖從表單的字符串中提取出2組數字:

12309123098_102938120938120938
1321312_103810312032123
123123123_10983094854905490
38293827_1293120938129308

我正在使用以下代碼來處理每個字符串:

if($string && $string =~ /^(\d)+_(\d)+$/) {
    if(IsInteger($1) && IsInteger($2)) { print "success ('$1','$2')"; }
    else { print "fail"; }
}

IsInterger()函數的位置如下:

sub IsInteger {
    my $integer = shift;
    if($integer && $integer =~ /^\d+$/) { return 1; }
    return;
}

此函數似乎在大多數情況下都有效,但由於某些原因導致以下情況失敗:

1287123437_1268098784380
1287123437_1267589971660

關於為什麽這些失敗而其他人成功的任何想法在此先感謝您的幫助!

最佳答案

如有疑問,請檢查您的正則表達式實際捕獲的內容。

use strict;
use warnings;

my @data = (
    '1321312_103810312032123',
    '123123123_10983094854905490',
);

for my $s (@data){
    print "\$1=$1 \$2=$2\n" if $s =~ /^(\d)+_(\d)+$/;
    # Output:
    # $1=2 $2=3
    # $1=3 $2=0
}

您可能打算采用這兩種方法中的第二種。

(\d)+  # Repeat a regex group 1+ times,
       # capturing only the last instance.

(\d+)  # Capture 1+ digits.

另外,在你的主循環和 IsInteger (這似乎是不必要的,在主循環中給出初始正則表達式)中,你正在測試真實而不是更具體的東西,例如 definedlength 。例如,零是一個有效的整數但是為false。

轉載註明原文: 當數字以0結尾時,為什麽我的正則表達式失敗?

猜你喜歡