Tcl正则表达式详解

上传人:飞*** 文档编号:39954270 上传时间:2018-05-21 格式:DOCX 页数:15 大小:33.89KB
返回 下载 相关 举报
Tcl正则表达式详解_第1页
第1页 / 共15页
Tcl正则表达式详解_第2页
第2页 / 共15页
Tcl正则表达式详解_第3页
第3页 / 共15页
Tcl正则表达式详解_第4页
第4页 / 共15页
Tcl正则表达式详解_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《Tcl正则表达式详解》由会员分享,可在线阅读,更多相关《Tcl正则表达式详解(15页珍藏版)》请在金锄头文库上搜索。

1、今天想用正则表达式来获取收到的 http 报文中的 content-length 字段的值的时候,无意中发现一篇用 tcl 语言写的文章,觉得很不错。所以转载。一、一、 介绍介绍追根溯源,正则表达式是在 1956 年的时候,人类最早研究神经网络的产物,但随着时间的流逝,几乎所有编程语言都加入了对它的支持,hoho其实这个东西也是程序员开发中比较有名的一个难点。但是不要以为它只能用于程序开发,在 Unix/Linux 系统管理中它也有极为广泛的应用。不要认为正则表达式很可怕,用直白的话来说,正则表达式就是利用 26 个英文字符与一些特殊符号的配合来进行文字内容比对的方法,绝大部分情况下,26 个

2、英文字符都代表它们本身,但在特殊符号的辅助下,这些英文字符也会有其他的含义,正则表达式比较困难的地方,也就在这种字符的 2 义性上面,这篇文档中对于这种具有字符 2 义性的地方,都会有专门的标注和说明。如果用过 Dos/Windows/Linux 中的通配符,就可以理解正则表达式的作用了,通配符用*号匹配任意多的任意字符,用?号匹配任意的一个字符,正则表达式有更加复杂的一套匹配系统,可以用来匹配几乎所有希望匹配的文字内容。二、二、 文档约定文档约定本文档中的所有实例,都是在以下环境中调试和运行的:本文档中的所有实例,都是在以下环境中调试和运行的:操作系统: CentOS4.1 (Linux 2

3、.6.9-11)编程语言: TCL8.4文本编辑器: VIM6.3.46文档格式约定:文档格式约定:实例的解释性文字,使用华文楷体小四号蓝色字体显示实例的解释性文字系统或程序输出,使用浅蓝色底纹表示系统或者程序输出特别需要注意和标注的地方,将以笑脸符号专门表示 看我可爱吗?三、三、 基本正则表达式基本正则表达式正则表达式中,26 个英文字符代表它们本身,但是下面表格中的特殊字符则赋予了更多不同的含义,一定要记住它们,因为它们是一切正则表达式的基础特殊字符特殊字符简要说明简要说明.一个点,匹配任意一个字符*星号,匹配前面模式中的零个或者任意个+加号,匹配前面模式中的一个或者任意个?问号,匹配前面

4、模式中的零个或者一个()括号,创建一个子模式|竖号,交替匹配中括号,用来表示一个区间尖号,将一个模式挂靠在要匹配的字符串的最前面$美元号,将一个模式挂靠在要匹配的字符串的最后面别看基本正则表达式就是这么 9 个符号,但是想完全理解和用好它们,还是很困难的,为了加深理解,我来详细的说明一下,这也是我自己学习时的理解和心得,请仔细的阅读。这些符号的作用需要多方位理解,我大概是根据符号所属的类型以及它们所起的作用这 2 个方向来理解它们的。按照类型划分,上面表格中的特殊字符分为几个类型:字符关键字:字符关键字:这部分关键字包括 26 个英文字符(上面的表格没有列出来)。这些关键字的特点就是它们匹配自

5、身。数量关键字:数量关键字:这部分关键字包括 . (点) * (星号) + (加号) ? (问号)这 4个关键字,这中间 . (点)这个关键字稍微特殊一点,因为它有 2 个作用:既可以作为字符关键字表示任何字符,又可以作为数量关键字代表 1 个字符。【任何字符任何字符】这个含义很深,因为空字符也算任何字符,也就是说一个点可以表示有一个字符,也可以表示没有字符,这个概念是新手很容易犯错的地方。数量关键字本身没有任何用处,它必须和【模式】这个概念一起共同作用,在正则表达式中,【模式】可以说是最为核心也最为广泛的内容。总体来说,模式就是用来表示自己想匹配字符的方法,但实际上模式的概念要更为复杂和广泛

6、,这部分内容我会在后面有更详细的描述,就现在来说,你只要理解,数量关键字必须与模式一起共用就可以了。模式关键字:模式关键字:() (括号) | (竖号) (中括号) (尖号) $ (美元号)这 5 个符号都属于模式关键字,它们要么代表模式本身(括号、竖号、中括号),要么作用于模式为模式提供其他更高级的功能(尖号、美元号)。现在,我们从另一个角度来看这些关键字,下面的内容,详细说明这 9 个关键字所起的作用以及实际表达方法,这部分会有一些比较详细的说明和实例,但是在此之前,我们必须了解一下什么是模式:什么是模式?什么是模式?模式就是一组用来匹配字符的关键字集合,一个最小的模式只有一个关键字,而大

7、的模式则可以有无数个关键字:A 这是一个模式,代表 A 这个字符本身A+ 这也是一个模式,代表一个或者任意多个 A 字符正则表达式中,数量关键字都是作用于左边模式的,上面的例子中,A 是一个没有数量关键字的模式,而 A+中的+号就向左作用于前面这个 A 模式,如果没有 A 这个模式,+号本身是没有任何意义的,这里 A 虽然是一个字符,但是我觉得把 A 称为模式能更清楚的理解模式的含义。正则表达式的核心就是对模式的掌握和操作,理解了模式就等于拿到了开启大门的钥匙。这里我介绍一个 TCL 语言中的命令:regsub,这个命令的作用就是利用正则表达式来获取想要的字符,它的使用方法如下:regexp

8、选项 其他保存子模式匹配字符串的变量上面 regexp 中用括起来的部分是可选的,其他 10.11.105.102.ssh: . ack 167128 win 1494416:49:52.292780 IP 10.11.105.15.2093 10.11.105.102.ssh: . ack 167332 win 16232set pattern .*(10.11.105.15).+?(d+)s+?+?set status regexp $pattern $dumpoutput tp iptp portputs “ip is:$iptp“puts “port is: $port“ip is:1

9、0.11.105.15port is: 2093上面的代码中,dumpoutput 变量是从 tcpdump 程序中截获的报文,最重要的正则表达式是 pattern 变量中的内容,观察一个正则表达式,应该首先观察它的子模式,从子模式中一般我们可以看到正则表达式中最重要最核心的部分,然后再观察外围的其他字符。上面的代码中有 2 个子模式,第一个子模式用来匹配 IP 地址,第二个子模式则使用高级正则表达式中的反斜杠字符序列,d 表示任意数值,后面的+?则用来匹配任意多个数值。外围的代码中,大量使用了?的非贪婪特性,其中s 这个反斜杠序列表示任意空白符号。2.2. 从从 tcpdumptcpdump

10、 中,提取中,提取 arparp 应答信息应答信息set dumpout 17:14:24.927839 arp who-has 10.11.105.254 tell 10.11.105.10217:14:24.927936 arp reply 10.11.105.254 is-at 00:13:72:35:a6:fdset pattern arp reply 10.11.105.254set st regexp - $pattern $dumpout matchputs $match这个正则表达式很简单,就是让关键字一个一个的对应匹配,其实刚刚开始写正则表达式有一个小技巧首先将关键字全部复制

11、出来,然后一点一点的替换,比如将空格替换成s+,数值替换成d+等等。3.3. 检查检查 arparp 表中是否清空了指定表中是否清空了指定 IPIP 的的 arparp 记录记录set pcarp Address HWtype HWaddress Flags Mask Iface10.11.105.29 (incomplete) eth010.11.105.19 ether 00:11:D8:35:13:84 C eth0set pattern (10.11.105.29)+?.*?incomplete+?set patt “u000A*u000D*“regsub -all - $patt $

12、pcarp pcarpset st regexp - $pattern $pcarp matchputs $match10.11.105.29 (incomplete上面的表达式使用了?这个非贪婪匹配关键字4.4. 从从 FWFW 上获取系统当前时间上获取系统当前时间set fwout +00 2007-07-24 08:25:38set pat .*(+0-92)s+(0-94-0-92-0-92)s+(0-92:0-92:0-92).*set st regexp $pat $fwout - t1 t2 t3puts “time area:$t1ndate:$t2ntime:$t3“set

13、pat (0-92):(0-92):(0-92)regexp $pat $t3 - hour minute secondputs “hour:$hournminute:$minutensecond:$second“set pat (0-94)-(0-92)-(0-92)regexp $pat $t2 - year month dateputs “year:$yearnmonth:$monthndate:$date“这个表达式使用了高级正则表达式中的概念,在模式后面用括起来的数字表示匹配前面的模式多少次,利用子模式可以单独提取内容。下面的实例除非必要就不再解释,请仔细观察。5.5. 从从 ifc

14、onfigifconfig 端口号中,获得端口号中,获得 IPIP 地址。地址。set result exec ifconfig eth1set pat (inet addr:)(s+)s+(Bcast:.*)regexp $pat $result - - ipputs “ip is :$ip“regexp 命令中的-表示不获取那个子模式中的值,因为这里使用了 2 个-,因此 ip 变量获取的就是第 2 个子模式的值了(第一个-获取整个表达式匹配的所有字符,第二个-获取第一个子模式中的值。六、六、 后记后记正则表达式使用极为灵活,特别是字符 2 义性的问题新手很容易出错,唯一的办法就是多使用、多练,在错误中慢慢领会语法的含义。虽然我在写这篇文档时想尽量加入自己的经验和理解,但实际上很多东西都是只能意会的,如果非要说清楚的话,不光语言会冗长无味,而且更容易把读者带入不知所措的境地,所以这里我尽量将平时使用最为频繁的功能以及最容易犯错的地方指出来,其他的就要靠读者自己试验了

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号