免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: send_linux
打印 上一主题 下一主题

正则表达进阶大讨论!欢迎参与讨论!(获奖名单已公布-2012-7-6) [复制链接]

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
24 [报告]
发表于 2012-06-01 09:33 |只看该作者
回复 1# send_linux
顶!

正则表达式的优劣,直接影响一个脚本语言的好坏

   

论坛徽章:
0
23 [报告]
发表于 2012-06-01 08:10 |只看该作者
回复 1# send_linux


1、在你的日常工作中会使用正则表达式解决什么样的问题?
主要是处理日志这块的,取出需要的数据,再进行后续处理的

2、正则表达式的用法在各个语言、脚本里面略有不同,你有什么学习经验可以分享给初学者?
目前只会写shell,perl学习中,所以也没什么可比较性,grep,sed,awk 的正则也略有不同,有时会写混淆,这个有点纠结,关键还是需要在工作中多运用,只看书是没有用的,不运用的话看完书就忘记了

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
22 [报告]
发表于 2012-06-01 06:58 |只看该作者
回复 14# zooyo


牛的一B
话说当年我的毕业设计也是一个IDS,其实就是从网上找个C源码,然后在自己机器上调通,嘿嘿。

论坛徽章:
27
CU大牛徽章
日期:2013-03-13 15:15:08CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-09-18 15:24:09CU大牛徽章
日期:2013-09-18 15:24:20CU大牛徽章
日期:2013-09-18 15:24:25CU大牛徽章
日期:2013-09-18 15:24:31CU大牛徽章
日期:2013-09-18 15:24:36CU大牛徽章
日期:2013-09-18 15:24:41CU大牛徽章
日期:2013-09-18 15:24:48CU大牛徽章
日期:2013-09-18 15:24:52处女座
日期:2013-09-27 17:45:43
21 [报告]
发表于 2012-06-01 00:40 |只看该作者
本帖最后由 yifangyou 于 2012-06-01 00:51 编辑

1、在你的日常工作中会使用正则表达式解决什么样的问题?
答:我在日常工作使用正则表达式主要解决
1) 日志分析或者查找或者替换文字,例如用perl进行统计apache中某个页面的访问量,在vi里替换
2)查找处理文件, ls a[1-5].log  ,find,或者egrep ,  用sed 替换或者删除文件内容。
3) 在开发网站时,用javascript验证表单,在php或者java验证参数格式是否正确
4)做lucene的网络蜘蛛时,用正则进行对网页url进行过滤,或者提取网页中的部分代码。
5)用php中的正则进行解析http协议
6)在apache和nginx中用url重写实现伪静态


2、正则表达式的用法在各个语言、脚本里面略有不同,你有什么学习经验可以分享给初学者?
答:
1)perl的正则表达式是最纯正的,perl的最强项就是处理文本,我个人第一次接触正则也是从perl的学习开始。
2)php作为最接近perl的一门语言,优点是没有perl语法那么晦涩难懂,把perl的灵活多变的正则表达式给继承过来,但是使用起来没有perl那么好用,而且没有perl效率高
3)javascript使用正则时和perl比较接近,个人感觉比php的正则更好用,主要用于验证用户输入,提醒输入错误,提供用户体验,没有支持perl中的translate。
下面是我一些常用的正则表达式
javascript:
  1. function checkIp(tmpstr)
  2. {
  3.                 var patrn=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/;
  4.                 var r=patrn.exec(tmpstr)
  5.                 if(!r)
  6.                 {
  7.                         return false;
  8.                 }
  9.                 if(r[1]<=255 && r[2]<=255 &&r[3]<=255 && r[4]<=255 )
  10.                         return true;
  11.                 else
  12.                         return false;
  13. }
  14. function is_numeric(tmpstr)
  15. {
  16.                 var patrn=/^\d+$/;
  17.                 var r=patrn.exec(tmpstr)
  18.                 if(!r)
  19.                 {
  20.                         return false;
  21.                 }
  22.                 return true;
  23. }
  24.        
  25. String.prototype.trim = function()
  26. {
  27.         return this.replace(/(^\s*)|(\s*$)/g, "");
  28. }
  29. /*
  30. * 只能输入英文数字.-下划线
  31. * @param str input的value
  32. * @use <input onkeyup="value=filterchar(value)" onafterpaste="value=filterchar(value)" />
  33. * */
  34. function filterchar(str){
  35.         var p=/[^\w\-\.]/g
  36.         return str.replace(p,'');
  37. }

  38. /*
  39. * 过滤特殊字符
  40. * @param str input的value
  41. * @use <input onkeyup="value=filterschar(value)" onafterpaste="value=filterschar(value)" />
  42. * */
  43. function filterschar(str){
  44.                 var p=/[\'\"#,;&%^\$!\+=\|\\\/ ]/g
  45.                 return str.replace(p,'');
  46. }
复制代码
php:
  1. /*
  2.         年 $matches[0]
  3.         月 $matches[1]
  4.         日 $matches[2]
  5.         时 $matches[3]
  6.         分 $matches[4]
  7.         秒 $matches[5]
  8.        
  9.   解析Y-m-d H:i:s YmdHis  Y/m/d H:i:s等等
  10. */
  11. function analytime($adate)
  12. {
  13.         if(preg_match("/^(\d{4})\D{0,3}(\d{2})\D{0,3}(\d{2})\D{0,3}(\d{2})\D{0,3}(\d{2})\D{0,3}(\d{2})$/i",$adate,$matches))
  14.         {
  15.                 array_shift($matches);
  16.                 return $matches;       
  17.         }
  18.         return 0;
  19. }
  20. //判断md5
  21.         function isMd5str($str)
  22.         {
  23.                 return preg_match("/\w{32}/i",$str);
  24.         }
复制代码
perl:
  1. #本程序的功能为判断一个字符串是不是ip,是ipv4还是ipv6
  2. #  以下是用来将 IPv6 地址表示为文本字符串的三种常规形式:
  3. #冒号十六进制形式
  4. #  这是首选形式 n:n:n:n:n:n:n:n。每个 n 都表示八个 16 位地址元素之一的十六进制值。例如:
  5. #  3FFE:FFFF:7654:FEDA:1245:BA98:3210:4562.
  6. #压缩形式
  7. #  由于地址长度要求,地址包含由零组成的长字符串的情况十分常见。为了简化对这些地址的写入,
  8. #     可以使用压缩形式,在这一压缩形式中,多个 0 块的单个连续序列由双冒号符号 (::) 表示。此符号只能在地址中出现一
  9. #
  10. #次。例如,多路广播地址 FFED:0:0:0:0:BA98:3210:4562 的压缩形式为 FFED::BA98:3210:4562。
  11. #单播地址
  12. #3FFE:FFFF:0:0:8:800:20C4:0 的压缩形式为 3FFE:FFFF::8:800:20C4:0。
  13. #环回地址 0:0:0:0:0:0:0:1 的压缩形式为 ::1。
  14. #未指定的地址 0:0:0:0:0:0:0:0 的压缩形式为 ::。
  15. #混合形式
  16. #  此形式组合 IPv4 和 IPv6 地址。在此情况下,地址格式为 n:n:n:n:n:n:d.d.d.d,
  17. #其中每个 n 都表示六个 IPv6 高序位 16 位地址元素之一的十六进制值,每个 d 都表示 IPv4 地址的十进制值。
  18. #@author yifangyou
  19. #@version gslb 2011-03-23

  20. @testIP=("1.1.1.1","255.255.255.255","1.-2.3.4","a.b.c.d","CDCD:910A:2222:5498:8475:1111:3900:2020","::","::g","F:F:F::1:1","F:F:10F::","::F:F:10F","F:E:E:A:B:C:10.0.0.1","F:E:E:A:B:C:10.0.a.1","F::10.0.0.1","F:::10.0.0.1","::10.0.0.1");
  21. for my $ip (@testIP) {
  22.         my $result=isIP($ip);
  23.         if($result){
  24.                 print "[$ip] is ipv$result\n";
  25.         }else{
  26.                 print "[$ip] is not ip\n";
  27.         }
  28. }

  29. #计算CDCD:或者:2222的个数
  30. #@author yifangyou
  31. #@version gslb 2011-03-23
  32. #@return 0:表示没有找到,>0表示替换了多少个
  33. sub cLength{
  34.         my $s= shift;
  35.   return  $s=~ s/([0-9a-f]{1,4}:)|(:[0-9a-f]{1,4})/ /gi;
  36. }

  37. #判断ipv4格式
  38. #@author yifangyou
  39. #@version gslb 2011-03-23
  40. #@return 0:表示不是ip,4:表示ipv4,6:表示ipv6
  41. sub isIP{
  42.         my $tmpstr=shift;
  43.         if(isIPv4($tmpstr)){
  44.                 return 4;
  45.         }
  46.         if(isIPv6($tmpstr)){
  47.                 return 6;       
  48.         }
  49.         return 0;
  50. }

  51. #判断ipv4格式
  52. #@author yifangyou
  53. #@version gslb 2011-03-23
  54. #@return 0:表示不是ipv4,1:表示ipv4
  55. sub isIPv4
  56. {
  57.         my $tmpstr=shift;
  58.         if(@matches=$tmpstr=~/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/i)
  59.   {
  60.             if($matches[0]<=255 && $matches[1]<=255 &&$matches[2]<=255 && $matches[3]<=255){
  61.                                 return 1;
  62.                         }
  63.   }
  64.   return 0;
  65. }

  66. #判断ipv6格式
  67. #@author yifangyou
  68. #@version gslb 2011-03-23        
  69. #@return 0:表示不是ipv6,1:表示ipv6
  70. sub isIPv6
  71. {
  72.           my $tmpstr=shift;
  73.           
  74. #                判断CDCD:910A:2222:5498:8475:1111:3900:2020
  75.     if($tmpstr=~/^([0-9a-f]{1,4}:){7}[0-9a-f]{1,4}$/i){
  76.             return 1;
  77.     }
  78. #                判断::
  79.     if($tmpstr=~/^::$/i){
  80.                     return 1;
  81.     }
  82. #                F:F:F::1:1  F:F:F:F:F::1  F::F:F:F:F:1格式   
  83.     if($tmpstr=~/^(([0-9a-f]{1,4}:){1,6})((:[0-9a-f]{1,4}){1,6})$/i){
  84.             my $c=cLength($tmpstr);
  85.             if($c>0 && $c<=7){
  86.                     return 1;
  87.             }
  88.     }
  89.                                                
  90. #                F:F:10F::
  91.     if($tmpstr=~/^([0-9a-f]{1,4}:){1,7}:$/i){
  92.             return 1;
  93.     }
  94.    
  95. #                ::F:F:10F
  96.     if($tmpstr=~/^:(:[0-9a-f]{1,4}){1,7}$/i){
  97.             return 1;
  98.     }
  99.                
  100. #                F:E:E:A:B:C:10.0.0.1格式
  101.                 if(@matches=$tmpstr=~/^([0-9a-f]{1,4}:){6}(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i){
  102.             if(isIPv4($matches[1])){
  103.                                 return 1;
  104.                         }
  105.     }

  106. #   F::10.0.0.1格式
  107.                 if(@matches=$tmpstr=~/^([0-9a-f]{1,4}:){1,5}:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i){
  108.             if(isIPv4($matches[1])){
  109.                                 return 1;
  110.                         }
  111.     }               
  112. #                ::10.0.0.1格式
  113.                 if(@matches=$tmpstr=~/^::(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i){
  114.             if(isIPv4($matches[0])){
  115.                                 return 1;
  116.                         }
  117.     }
  118.                 return 0;
  119. }
复制代码

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
20 [报告]
发表于 2012-05-31 23:31 |只看该作者
可以说一切表达皆正则么? 正则告诉我们我们的表达都是有规律可循的,都符合一定的模式,通过正则匹配,我们可以找到我们想要的藏在茫茫互联网中的一切东西,网页抓取,数据整理,这都离不开正则

论坛徽章:
13
CU大牛徽章
日期:2013-04-17 11:20:3615-16赛季CBA联赛之吉林
日期:2017-05-25 16:45:4715-16赛季CBA联赛之福建
日期:2017-03-13 11:33:442017金鸡报晓
日期:2017-02-08 10:39:422017金鸡报晓
日期:2017-01-10 15:13:29IT运维版块每日发帖之星
日期:2016-03-15 06:20:01IT运维版块每日发帖之星
日期:2015-10-02 06:20:00CU十二周年纪念徽章
日期:2013-10-24 15:41:34CU大牛徽章
日期:2013-09-18 15:15:45CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-04-17 11:46:39CU大牛徽章
日期:2013-04-17 11:46:28
19 [报告]
发表于 2012-05-31 23:13 |只看该作者
我使用bash环境下的grep/sed 来进行特殊化处理文件(包括过滤/命令特例化)

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
18 [报告]
发表于 2012-05-31 23:12 |只看该作者
回复 1# send_linux


    为什么现在这个超链接到其他网页的样章都下载不了,确切是那个网页进不去

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
17 [报告]
发表于 2012-05-31 23:07 |只看该作者
zooyo 发表于 2012-05-31 22:52
回复 5# renxiao2003


荣誉版主勋章和荣誉会员勋章早就不颁发了,还请见谅:)

论坛徽章:
0
16 [报告]
发表于 2012-05-31 23:05 |只看该作者
本帖最后由 xbokx 于 2012-05-31 23:06 编辑

新人一个,来取经。
第一次接触正则是在用sed和gawk这俩工具时,感觉在搜索这方面确实有强大之处。
不知需要配上算法来使用否!估计会更牛。。

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
15 [报告]
发表于 2012-05-31 22:52 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP