免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3462 | 回复: 9
打印 上一主题 下一主题

如何只用perl的正则来判断一个整数小于255? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-16 16:11 |只看该作者 |倒序浏览
偶在做一个日志分析的小程序, 想把里面的IP给过滤出来, 于是有上面的问题......
虽然也可以用正则+比较大小的方法来做,但是如果只用正则便能过滤出IP来, 不是更有成就感么......

论坛徽章:
0
2 [报告]
发表于 2006-05-16 16:25 |只看该作者

用这个试试

\d{1,3}\.\d{1,3}\.\d{1,3}

论坛徽章:
0
3 [报告]
发表于 2006-05-16 16:40 |只看该作者
原帖由 dukejoe 于 2006-5-16 16:25 发表
\d{1,3}\.\d{1,3}\.\d{1,3}

你这个太粗糙了啊,按你的正则,266.266.266.266也是合法的IP了???

论坛徽章:
0
4 [报告]
发表于 2006-05-16 17:21 |只看该作者
谢谢楼下指正,已修改。
  1. my $e = qr/[01]?[0-9]?[0-9]|2([0-4][0-9]|5[0-5])/;
  2. my $match_ip = qr/$e\.$e\.$e\.$e/;
  3. if ( $ip_addr =~ /^$match_ip$/ ){
  4.     ....
  5. }
复制代码

[ 本帖最后由 莫愁 于 2006-5-18 09:53 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2006-05-16 17:55 |只看该作者
上面的正常情况下可行,已经把可能的情况穷举出来了,
在这种情况下出错:'93.25449.12'
应该是忘了把 . 逃逸的缘故
改成这样就行了

  1. my $match_ip = qr/$e\.$e\.$e\.$e/;
复制代码



下面这个也可行,摘自正则研究室

  1. /^(?:(?:25[0-5]|2[0-4]\d|[01]\d\d|\d?\d)(?(?=\.?\d)\.)){4}$/
复制代码

[ 本帖最后由 Namelessxp 于 2006-5-16 18:05 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2006-05-16 18:44 |只看该作者
楼上的都好强,佩服ing
按四楼的做,好像有一点点小问题,比如说日志文件中如果有 115.064.13.234 这个IP,但是只过滤出 115.064.13.23 这个IP,少了一位。。。

楼上给的/^(??:25[0-5]|2[0-4]\d|[01]\d\d|\d?\d)(?(?=\.?\d)\.)){4}$/看得偶头晕,偶慢慢研究研究:)

论坛徽章:
0
7 [报告]
发表于 2006-05-16 19:02 |只看该作者
应该不会的,四楼的代码我试着是正常的,如果不行,试试下面的

  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. $\ = "\n";
  5. my $ip = '115.064.13.234';
  6. my @ips;
  7. if (@ips = $ip =~ /^([0-1][0-9]{0,2}|25[0-5]?|2[0-4]?[1-9]?|[3-9][0-9]?)\.([0-1][0-9]{0,2}|25[0-5]?|2[0-4]?[1-9]?|[3-9][0-9]?)\.([0-1][0-9]{0,2}|25[0-5]?|2[0-4]?[1-9]?|[3-9][0-9]?)\.([0-1][0-9]{0,2}|25[0-5]?|2[0-4]?[1-9]?|[3-9][0-9]?)/)
  8. {
  9.         print 'true';
  10. } else {
  11.         print 'false';
  12. }
  13. print join '.',@ips;
  14. my $e = qr/[01]?[0-9]?[0-9]|2(?:[0-4][0-9]|5[0-5])/;
  15. my $match_ip = qr/$e\.$e\.$e\.$e/;
  16. if (@ips = $ip =~ /(^$match_ip$)/ ){
  17.     print 'true2';
  18. } else {
  19.         print 'false2';
  20. }
  21. print @ips;
  22. if (@ips = $ip =~ /^((?:(?:25[0-5]|2[0-4]\d|[01]\d\d|\d?\d)(?(?=\.?\d)\.)){4}$)/){
  23.         print 'true3';
  24. } else {
  25.         print 'false3';
  26. }
  27. print @ips;
复制代码

论坛徽章:
0
8 [报告]
发表于 2006-05-16 19:08 |只看该作者
原帖由 Namelessxp 于 2006-5-16 17:55 发表
上面的正常情况下可行,已经把可能的情况穷举出来了,
在这种情况下出错:'93.25449.12'
应该是忘了把 . 逃逸的缘故
改成这样就行了

  1. my $match_ip = qr/$e\.$e\.$e\.$e/;
复制代码



下面这个也可行 ...

谢谢!
我忘记把 . 是元字符了

论坛徽章:
0
9 [报告]
发表于 2006-05-16 19:32 |只看该作者
这个是俺的代码,初学perl,格式还不是很规范:


  1. use warnings;
  2. use strict;
  3. my $e = qr/[01]?[0-9]?[0-9]|2(?:[0-4][0-9]|5[0-5])/;
  4. my $line="115.064.13.234";
  5. $line =~ s/($e)\.($e)\.($e)\.($e)/$4.$3.$2.$1/;
  6. print "$1.$2.$3.$4\n";
  7. print "$line\n";
复制代码

输出的结果是

115.064.13.23
23.13.064.1154


这是为什么呢?

[ 本帖最后由 cock 于 2006-5-16 19:37 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2006-05-18 09:41 |只看该作者

楼上应该是漏了 ^ 和 $ 符号

《mastering regular expressions (2nd) 》有这个例子 (P189)
作者给的代码如下:
{^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP