0

我有一个快速的问题。我在下面的代码中做错了什么:

#!/usr/bin/perl -w
use strict;
my $num = "12345";
print "$num \n" if $num =~ m/\d{1,3}/;

由于我的号码是 5 位长,我希望输出不应该打印任何内容,因为 if 语句正在寻找一个至少 1 位和最多 3 位的数字。但是我的脚本将输出打印如下:

# perl num.pl 
12345 

我误解了上面的正则表达式吗?

谢谢。

编辑:

所以,实际上我正在尝试匹配字符串之类的 IP 地址。例如,我想匹配11.222.3.444但它不起作用,m/\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}/ 所以我开始处理仅包含数字的单个字符串,然后将其发布在堆栈溢出中。

如果我必须输入 ^ OR $ 那么如果我想匹配上面提到的字符串 s 这样的 IP 地址,我应该如何使用它们。

谢谢你的时间。

4

2 回答 2

2

你的 perl 代码说的是,“在字符串 $num 中,你能找到一个至少 1 个字符,最多 3 个字符的字符串,它只由数字组成。” 答案当然是肯定的。

你想要的是

print "$num \n" if $num =~ m/^\d{1,3}$/;

这意味着“在字符串 $num 中,从第一个字符开始到最后一个字符,是否有一个字符串,长度至少为 1 个字符,最多为 3 个字符,仅由数字组成。”

如果您正在尝试查找类似 ip address regexp 以匹配 IP 地址的内容,则可以很好地讨论如何做到这一点。

于 2012-09-07T06:25:45.983 回答
0

下面的代码正确地验证了 IP 地址。下面列出了考虑的验证。1)如果IP地址的任何部分由小数分隔的长度超过一位,则不应以零开头。2) 以小数点分隔的IP 地址的第一位不能为零。3) IP 地址的任何部分以小数分隔,不能超过 255。

要求成员对正则表达式进行微调,因为它看起来太大且令人困惑。

print "Enter the IP address : ";
$ip = <stdin>;
if($ip =~ /^([3-9]\d?|1\d?\d?|2([0-4]?\d?|5[0-5]|[6-9]?))(\.(0|[3-9]\d?|(1\d?\d?|2([0-4]?\d?|5[0-5]|[6-9]?)))){3}$/) {
    print "Correct\n";
}
else {
    print "Wrong\n";
}
于 2014-03-26T12:48:10.050 回答