Perl:正则表达式(匹配重复)

时间:2012-09-07 06:21:03

标签: regex perl

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

#!/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 

我是否误解了上述正则表达式?

感谢。

修改

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

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

谢谢你的时间。

2 个答案:

答案 0 :(得分:2)

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

你想要的是

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

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

如果你想找到像ip地址这样的东西 regexp to match IP address很好地讨论了如何做到这一点。

答案 1 :(得分: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";
}