您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 统计图表 > TCL+正则表达式参考
正则表达式参考——蒋小超2007-07-23一、一、一、一、介绍介绍介绍介绍追根溯源,正则表达式是在1956年的时候,人类最早研究神经网络的产物,但随着时间的流逝,几乎所有编程语言都加入了对它的支持,hoho~其实这个东西也是程序员开发中比较有名的一个难点。但是不要以为它只能用于程序开发,在Unix/Linux系统管理中它也有极为广泛的应用。不要认为正则表达式很可怕,用直白的话来说,正则表达式就是利用26个英文字符与一些特殊符号的配合来进行文字内容比对的方法,绝大部分情况下,26个英文字符都代表它们本身,但在特殊符号的辅助下,这些英文字符也会有其他的含义,正则表达式比较困难的地方,也就在这种字符的2义性上面,这篇文档中对于这种具有字符2义性的地方,都会有专门的标注和说明。如果用过Dos/Windows/Linux中的通配符,就可以理解正则表达式的作用了,通配符用*号匹配任意多的任意字符,用?号匹配任意的一个字符,正则表达式有更加复杂的一套匹配系统,可以用来匹配几乎所有希望匹配的文字内容。-2-二、二、二、二、文档约定文档约定文档约定文档约定本文档中的所有实例,都是在以下环境中调试和运行的:本文档中的所有实例,都是在以下环境中调试和运行的:本文档中的所有实例,都是在以下环境中调试和运行的:本文档中的所有实例,都是在以下环境中调试和运行的:操作系统:CentOS4.1(Linux2.6.9-11)编程语言:TCL8.4文本编辑器:VIM6.3.46文档格式约定:文档格式约定:文档格式约定:文档格式约定:实例的解释性文字,使用华文楷体小四号蓝色字体显示实例的解释性文字系统或程序输出,使用浅蓝色底纹表示特别需要注意和标注的地方,将以笑脸符号专门表示看我可爱吗?系统或者程序输出-3-三、三、三、三、基本正则表达式基本正则表达式基本正则表达式基本正则表达式正则表达式中,26个英文字符代表它们本身,但是下面表格中的特殊字符则赋予了更多不同的含义,一定要记住它们,因为它们是一切正则表达式的基础别看基本正则表达式就是这么9个符号,但是想完全理解和用好它们,还是很困难的,为了加深理解,我来详细的说明一下,这也是我自己学习时的理解和心得,请仔细的阅读。要想完全明白这些符号的作用,必须多方位理解,我大概是根据符号所属的类型以及它们所起的作用这2个方向来理解它们的。特殊字符特殊字符特殊字符特殊字符简要说明简要说明简要说明简要说明....一个点.匹配任意一个字符****星号,匹配前面模式中的零个或者任意个++++加号,匹配前面模式中的一个或者任意个????问号,匹配前面模式中的零个或者一个()()()()括号,创建一个子模式||||竖号,交替匹配[][][][]中括号,用来表示一个区间^^^^尖号,将一个模式挂靠在要匹配的字符串的最前面$$$$美元号,将一个模式挂靠在要匹配的字符串的最后面-4-按照类型划分,上面表格中的特殊字符分为几个类型:按照类型划分,上面表格中的特殊字符分为几个类型:按照类型划分,上面表格中的特殊字符分为几个类型:按照类型划分,上面表格中的特殊字符分为几个类型:字符关键字:字符关键字:字符关键字:字符关键字:这部分关键字包括26个英文字符(上面的表格没有列出来)。这些关键字的特点就是它们匹配自身。数量关键字:数量关键字:数量关键字:数量关键字:这部分关键字包括....(点)****(星号)++++(加号)????(问号)这4个关键字,这中间....(点)这个关键字稍微特殊一点,因为它有2个作用:既可以作为字符关键字表示任何字符,又可以作为数量关键字代表1个字符。【任何字符】【任何字符】【任何字符】【任何字符】这个含义很深,因为——空字符也算任何字符,也就是说一个点可以表示有一个字符,也可以表示没有字符,这个概念是新手很容易犯错的地方。数量关键字本身没有任何用处,它必须和【模式】这个概念一起共同作用,在正则表达式中,【模式】可以说是最为核心也最为广泛的内容。总体来说,模式就是用来表示自己想匹配字符的方法,但实际上模式的概念要更为复杂和广泛,这部分内容我会在后面有更详细的描述,就现在来说,你只要理解,数量关键字必须与模式一起共用就可以了。模式关键字:模式关键字:模式关键字:模式关键字:()(括号)|(竖号)[](中括号)^(尖号)$(美元号)这5个符号都属于模式关键字,它们要么代表模式本身(括号、竖号、中括号),要-5-么作用于模式为模式提供其他更高级的功能(尖号、美元号)。现在,我们从另一个角度来看这些关键字,下面的内容,详细说明这9个关键字所起的作用以及实际表达方法,这部分会有一些比较详细的说明和实例,但是在此之前,我们必须了解一下什么是模式:什么是模式?什么是模式?什么是模式?什么是模式?模式就是一组用来匹配字符的关键字集合,一个最小的模式只有一个关键字,而大的模式则可以有无数个关键字:A这是一个模式,代表A这个字符本身A+这也是一个模式,代表一个或者任意多个A字符正则表达式中,数量关键字都是作用于左边模式的,上面的例子中,A是一个没有数量关键字的模式,而A+中的++++号就向左作用于前面这个A模式,如果没有A这个模式,++++号本身是没有任何意义的,这里A虽然是一个字符,但是我觉得把A称为模式能更清楚的理解模式的含义。正则表达式的核心就是对模式的掌握和操作,理解了模式就等于拿到了开启大门的钥匙。这里我介绍一个TCL语言中的命令:regsubregsubregsubregsub,这个命令的作用就是利用正则表达式来获取想要的字符,它的使用方法如下:regsubregsubregsubregsub[选项]正则表达式匹配的原始字符串保存匹配后字符串的变量[其他保存子模式匹配字符串的变量]上面regsubregsubregsubregsub中用[][][][]括起来的部分是可选的,其他括起来的部分是必须的,如果正则表达式匹配从原始字符串中匹配到了内容,则命令返回1并且将匹配到的内容保存匹配后字符串的变量中。-6-下面我们来看1个简单的例子:regsub{A+}AABBCCmatchputs$match上面的puts命令用来打印match变量中的内容,A+这个模式从AABBCC这个原始字符串中匹配到了AA这2个字符,并将它置于match这个变量中,这就是一个最基本的正则表达式使用过程。正因为模式如此重要,下面的内容就要详细说明几个模式关键字的作用了:()()()()子模式匹配关键字子模式匹配关键字子模式匹配关键字子模式匹配关键字小括号用来将一个大模式分为几段更小的模式,这样就可以更加精细的控制匹配方式了,我们来看一个例子:regexp--{(AA)(BB)(CC)}AABBCCmatchsub1sub2sub3putsThematchis:$matchputsThesub1is:$sub1putsThesub2is:$sub2putsThesub3is:$sub3上面的例子中,处于{}{}{}{}之间的内容是一个完整的正则表达式,在正则表达式里面我们用()()()()将表达式分为3个子模式,后面的match变量中保存所有已经匹配到的字符,而几个sub?变量则保存相应子模式中匹配到的字符。||||交替匹配关键字交替匹配关键字交替匹配关键字交替匹配关键字交替匹配用来匹配|符号二边的一个模式,比如下面的例子:TOPSEC|topsec上面的表达式表示匹配要么是全部大写的TOPSEC,要么是全部小写的AAThematchis:AABBCCThesub1is:AAThesub2is:BBThesub3is:CC-7-topsec,不能2个都同时匹配。[][][][]区间匹配区间匹配区间匹配区间匹配区间匹配用来表示匹配一系列字符串中间的一个,比如下面的例子:regexp{[ADEFG]}AAABBBCCCmatchputs$match上面的表达式表示匹配ABCDE这5个字符中的一个,注意:只是一个如果想匹配多个呢?可以使用数量关键字辅助:regexp{[ADEFG]+}AAABBBCCCmatchputs$match区间匹配还可以使用[a-z]这样的语法来表示匹配从小写a到小写z这26个小写字母中的一个这个关键字使用必须非常小心,因为在TCL语言中[]还有另外一个含义:所有处于[]中的内容是一条TCL命令,因此在regsub中使用的时候,必须用{}{}{}{}将[][][][]的其他含义取消掉,如果将{}{}{}{}换成,那么上面的命令会报错。^^^^挂靠匹配,将模式挂靠在字符串的开头挂靠匹配,将模式挂靠在字符串的开头挂靠匹配,将模式挂靠在字符串的开头挂靠匹配,将模式挂靠在字符串的开头这是一个很特殊的关键字,它不像其他关键字是作用于左边的模式上,而是作用于右边的模式上,千万注意这一点!它表示从要匹配的字符串的最前面开始匹配,我们来看一个比较的例子:regsub{(AAA)}BBBAAACCCmatch可以匹配到,match中的值是AAA,但是我们加上挂靠匹配字符之后呢:regsub{^(AAA)}BBBAAACCCmatch无法匹配,match中的值为空,因为^符号要求必须从要匹配的字符最前面开始匹配,可惜要匹配的字符最前面是BBB,所以无法匹配到。AAAA-8-^^^^这个字符也有2义性,如果把它放在模式关键字中的话,它表示【非】的意思,比如[^a-z]表示匹配不是a-z字母的其他字符,它还可以放入小括号中,比如(^ab)表示第一个字符不能是a,第二个字符必须是b,但是如果放在模式外面,比如^(ab)表示必须最前面是ab这2个字符,这是很容易搞混的地方,一定要注意了。$$$$挂靠匹配,将模式挂靠在字符串的结尾挂靠匹配,将模式挂靠在字符串的结尾挂靠匹配,将模式挂靠在字符串的结尾挂靠匹配,将模式挂靠在字符串的结尾这个关键字与^关键字作用相反,但是它和其他关键字一样,是作用于左边的模式上,还是看看例子:regsub{(AAA)$}BBBCCCAAAmatch可以匹配到,因为要匹配的字符最后面是AAA,如果要匹配的字符是BBBAAACCC这样的,就无法匹配到了。数量关键字:数量关键字:数量关键字:数量关键字:.(点)*(星号)+(加号)?(问号)用来表示数量。....匹配任意一个字符匹配任意一个字符匹配任意一个字符匹配任意一个字符....(点)是一个比较特殊的字符,它虽然表示匹配任意一个字符,但实际上任意字符也包括空字符。****匹匹匹匹配前面模式中的零个或任意多个配前面模式中的零个或任意多个配前面模式中的零个或任意多个配前面模式中的零个或任意多个零个这个概念很重要,也就是说不管有没有都会匹配,所以一般我们都会用.*这样的方式来表示任意多个任意字符,不管有没有都可以。++++匹配前面模式中的匹配前面模式中的匹配前面模式中的匹配前面模式中的1111个或任意多个个或任意多个个或任意多个个或任意多个-9-????匹配前面模式中的匹配前面模式中的匹配前面模式中的匹配前面模式中的0000个或个或个或个或1111个个个个????号还有一个术语——非贪婪模式,这也是正则表达式中非常重要的内容,所谓非贪婪模式,就是表示只要匹配到第一个就会停下来,而贪婪模式正好相反,它会尽可能多的匹配,这2种模式的最终结果就是:非贪婪模式总是获得第一个匹配,贪婪模式总是获得最后一个匹配。默认情况下,正则表达式总是处于贪婪模式下的。基本正则表达式中还有一个很重要的符号:\(反斜杠),它用来关闭上面这些特殊字符的特殊含义,比如:\*表示一个星号本身\+表示一个加号本身\\表示一个反斜杠\(o(∩_∩)o...哈哈,自己关闭了自己)在高级正则表达式中,反斜杠还有更多的用途。-10-四、四、四、四、高级正则表达式高级正则表达式高级正则表达式高级正则表达式高级正则表达式是基本正则表达式的扩展,总体来说,高级表达式扩展了以下3个方面的功能:1111....反斜杠字符序列反斜杠字符序列反斜杠字符序列反斜杠字符序列个人认为反斜杠字符序列应该是高级正则表达式最
本文标题:TCL+正则表达式参考
链接地址:https://www.777doc.com/doc-4408965 .html