ChinaUnix.net 首页 | 博客 | Linux | 论坛 | 人才 | 培训 | 知识库 | 资料 | 读书 | 手册 | 精华 | 下载 | 沙龙 | 搜索
Linux首页 | Linux论坛 | 论坛精华 | 开源新闻 | 技术文章 | 专题专栏 | 新手指南 | 迁移方案 | 产品方案 | 开源项目 | 开源图书 | 软件下载 | 人才招聘 | Linux博客
  搜索

  产品与方案
·中科红旗全面打造现代化邮政体系
·红旗助力“网上审批服务” 推动电子政务
·红旗正版化开创呼和浩特网吧建设新起点
·红旗Linux助信息产业部邮件服务器“快跑”
·中标普华Linux 为电子政务信息化保驾护航
·中标普华Linux助力基金产业
·中标普华Office率先支持UOF标准
·中标普华邮件系统助力西藏政府信息化建设
·红旗Linux助力国库集中支付系统改革
·红旗助中信卫星 掀起GIS通信应用风暴
·红旗软件助力烟草总局 全面建设“数字烟草”
·红旗助力“信访阳光工程”打造畅通信访渠道
·红帽联合FIS发布下一代实时核心银行平台
·红旗助力金盾 打造全无忧出入境信息系统
·红旗Linux全力打造中国邮政总局名址信息库
·爱尔兰证交所从Unix迁移到红帽企业Linux
·一流的意大利银行选择使用红帽企业Linux
·PLUS Finanzservice选择使用红帽企业Linux
·红帽助力TransACT Communications 公司
·法国零售业巨头Lapeyre采用Redhat Linux
·旅游预订网站选择使用红帽企业Linux
·马哈拉施特拉邦政府的红帽解决之道
·美国联邦政府案例
·红帽为慕尼黑展览会提供现代化集群系统
·Yuba郡用开源软件和红帽产品提高了效率
·红帽企业Linux助印度理工建立高性能计算中心
·采用红帽Linux 将系统维护时间缩短了65%
·从UNIX迁移到Linux使Peñoles公司获益非浅
·Hikal公司用红帽企业Linux开展任务关键的ERP项目
·KDE3.5.4新版本发布
·芝加哥商业交易所从Unix向Linux迁移
·南方基金管理有限公司成功案例 Red Hat Linux
·广东北电通讯设备有限公司成功案例
·挪威国家石油公司从UNIX迁移到红帽Linux,成本减半
·中央电视台CCTV动画部案例 Red Hat Linux

  图书

鸟哥的Linux私房菜基础学..


Linux程序设计.第3版


Linux设备驱动开发详解


  下载
·Endian Firewall
·linux kernel(Linux 内核)
·CentOS
·Fedora Core 6
·Scientific Linux
·Slackware 11.0
·Gentoo Linux
·ubuntu-6.10-i386服务器版本
·ubuntu-6.10-amd64服务器版
·ubuntu-6.10-i386桌面版
·ubuntu-6.10-amd64桌面版
·Engarde Linux
您的位置: Linux时代 > 技术文档 > 新手入门 >

Perl语言的精华--模式匹配

日期:2008-01-09 作者:ITPUB 来自:linux.chinaunix.net


  常规表达式(Regular Expression)也译作正则表达式或文字处理模式,是指定模式的一种方法,这种模式对文本进行筛选,只匹配特定的字符串。一旦匹配到了一个字符串,就可以从大量的文本中将其抽取出来,或者利用另一个字符串来替代这个字符串。

  常规表达式也是初学Perl者的难点所在,但一旦掌握其语法,它们就拥有几乎无限的模式匹配能力,而且Perl编程的大部分工作都是掌握常规表达式。

  一 常规表达式中,/pattern/常用到的语法

  /pattern/ 结果

  除了换行字符外,找寻只有一个字符的字符串

  x? 找寻0个或是1个x字符

  x* 找寻0个或是0个以上的x字符

  .* 找寻0个或是0个以上的任何字符

  x+ 找寻0个或是1个以上的x字符

  .+ 找寻1个或是1个以上的任何字符

  {m}  找寻刚好是m个个数指定的字符

  {m,n} 找寻在m个数个数以上,n个个数以下指定的字符

  {m,}  找寻m个个数以上指定的字符

  〔〕  找寻符合〔〕内的字符

  〔^〕找寻不符合〔〕内的字符

  〔0-9〕 找寻符合0到9的任何一个字符

  〔a-z〕 找寻符合a到z的任何一个字符

  〔^0-9〕 找寻不符合0到9的任何一个字符

  〔^a-z〕 找寻不符合a到z的任何一个字符

  ^ 找寻字符开头的字符

  $ 找寻字符结尾的字符

  d 找寻一个digit(数字)的字符,和〔0-9〕语法一样

  d+ 找寻一个digit(数字)以上的字符串,和〔0-9〕+语法一样

  D 找寻一个non-digit(非数字)的字符,和〔^0-9〕语法一样

  D+ 找寻一个non-digit(非数字)以上的字符,和〔^0-9〕+语法一样

  w 找寻一个英文字母或是数值的字符,和〔a-zA-Z0-9〕语法一样

  w+ 找寻一个以上英文字母或是数值的字符,和〔a-zA-Z0-9〕+语法一样

  W 找寻一个非英文字母,数值的字符,和〔^a-zA-Z0-9〕语法一样

  W+ 找寻一个以上非英文字母,数值的字符,和〔^a-zA-Z0-9〕+语法一样

  s 找寻一个空白的字符,和〔 f〕一样

  s+ 找寻一个以上空白的字符,和〔 f〕+一样

  S 找寻一个非空白的字符,和〔^  f〕一样

  S+ 找寻一个以上非空白的字符,和〔^  f〕+一样

   找寻一个不以英文字母,数值为边界的字符串

  B 找寻一个以英文字母,数值为边界的字符串

  a|b|c 找到符合a字符或是b字符或是c字符的字符串

  abc 找到一个含有abc的字符串

  (pattern)  ()这个符号是会记忆所找寻到的字符,是一个很实用的语法

  第一个()内所找到的字符串变成$1这个变量或是1变量

  第二个()内所找到的字符串变成$2这个变量或是2变量

  以此类推,笔者会在下一小节中详细介绍它的用法

  /pattern/i i这个参数是代表忽略英文大小写的意思,也就是在找寻字符 串的时候,不会去考虑英文的大小写

  如果要在pattern模式中找寻一个有特殊的意义的字符,要在 这个字符前加上这个符号,这样才会让这个特殊字符失效。

  二 常规表达式(Regular Expression)的简单范例

  看了上一小节文字处理模(Regular Expression)之的,初学者对于这个语法的应用可能还不是很清楚,所以笔者会在这一小节中,举出一些在常规表达式中常用的范例给大家看看:

  范例 说明

  /perl/ 找到含有perl的字符串

  /^perl/ 找到开头是perl的字符串

  /perl$/ 找到结尾是perl的字符串

  /c|g|i/ 找到含有c或g或i的字符串

  /cg{2,4}i/ 找到c后面跟着2个到4个g,再跟着i的字符串

  /cg{2,}i/ 找到c后面跟着2个以上g,再跟着i的字符串

  /cg{2}i/ 找到c后面跟着2个g,再跟着i的字符串

  /cg*i/ 找到c后面跟着0个或多个g,再跟着i的字符串,如同/cg{0,1}i/

  /cg+i/ 找到c后面跟着一个以上g,再跟着c的字符串,如同/cg{1,}i/

  /cg?i/ 找到c后面跟着0个或是一个g,再跟着c的字符串,如同/cg{0,1}i/

  /c.i/ 找到c后面跟着一个任意字符,再跟着i的字符串

  /c..i/ 找到c后面跟着二个任意字符,再跟着i的字符串

  /〔cgi〕/ 找到符合有这三个字符任意一个的字符串

  /〔^cgi〕/ 找到没有这三个字符中任意一个的字符串

  /d/ 找寻符合数值的字符串

  可以使用/d+/来表示一个或是多个数值的字符串

  /D/ 找寻符合不是数值的字符串

  可以使用/D+/来表示一个或是更多个非数值的字符串

  /w/ 找寻符合英文字母,数值的字符串

  可以使用/w+/来表示一个或是更多个英文字母,数值的字符串

  /W/ 找寻符合非英文字母,数值字符的字符串

  可以使用/W+/来表示一个或是更多个非英文字母,数值的字符串

  /s/ 找寻符合空白的字符串

  可以使用/s+/来表示一个或是更多个空白字符的字符串

  /S/ 找寻符合不是空白的字符串

  可以使用/S+/来表示一个或是更多不是空白的字符的字符串

  /*/ 找寻符合*这个符号的字符串,因为*在常规表达式中有它的特殊意思,所以要在这个特殊符号前加上这个符号,这样才会让这个特殊字符失效

  /abc/i 找寻符合abc的字符串而且不考虑这些符合字符串的大小写

三 常规表达式(Regular Expresion)相关的运算符及函数

  在perl程序写作中常会用到=~和!~这两个运算符及s和t这二个函数来和常规表达式/pattern/搭配而成一个运算式,如果能够活用这些指令的话,就可以很。轻易地来处理一些字符串,当然在CGI程序设计中了就更能得心应手了。现在就让作者来介绍这些运算符及函数的用法:

  指令:/pattern/文字运算

  说明: 如果在文字运算中没有使用=~或是!~运算符指定一个字符串来做运算的话,就会使用内定的输出变量$_来做/pattern/文字运算。

  范例一:

  $string="chmod711cgi";

  $string=~/(W)s+(d+)/;

  第一个(W+)是代表找寻数个字母,并将的找到的字符串指派给$1这个变量,而s+代表找寻多个空白的字符串,最后(d+)代表找寻个数值,并将所找到的字符串指派给$2这个变量。所以$1="chmod";$2=711;但是$string还是等于原来的字符串,没有改变。

  范例二:

  $_="chmod711cgi";

  /(W)s+(d+)/;

  因为是把字符串指定给$_这个变量,所以可以不用=~这个运算符就会得到

  $1="chmod";$2=711;而且$_还是等于原来的字符串,没有改变。

  范例三:

  $string="chmod711cgi";

  @list=split(/s+/,$string);

  以上一个或是多个空白字符来分割$string这个字符串,这是一个很常用的语法。此时@list=("chmod","711","cgi");

  指令: =~相配运算符

  说明:这是Perl语言中特有的语法,通常会和文字处理来作运算。

  范例:

  print"请输入一个字符串! ";   $string=; #代表标准输入,会让使用者输入一字符串   chop($string); #将$string最后一个换行的字符删除掉   if($string=~/cgi/){   print("输入的字符串中有cgi这个字符串! ";   }

  如果输入的字符串含有cgi这个字符串的话,就会显示出这个信息。

  指令:!~不相配运算符

  说明:这也是Perl语言中特有的语法,通常会和常规表达式来运算。

  范例: 

  print"请输入一个字符串! ";   $string=; #代表标准输入,会让使用者输入一字符串   chop($string); #将$string最后一个换行的字符删除掉   if($string!~/cgi/)   {   print("输入的字符串中有cgi这个字符串! ";   }

  如果输入的字符串中没有cgi这个字符串的话,就会显示出这个信息。

  指令:tr转换函数

  语法:tr/SEARCHLIST/REPLACELIST/

  其中SEARCHLIST是要转换的字符;REPLACELIST是转换成何种字符。

  说明:tr(translate)就是转换的意思,会把符合转换的字符转换成要转换的字符。

  范例一:

  $string="testing";

  $string=~tr/et/ET/"; #此时$string="TEsTing";

  $string=~tr/a-z/A-Z/; #此时$stirng="TESTING";

  范例二:

  $string="CGI+Perl";

  $string=~tr/+//; #此时$string="CGI Perl";

  在传送CGI数据的时候会先将数据编码,其中会将空白的字符转成+这个字符。

  指令:s 取代函数

  语法:s/PATTERN/REPLACE/eg

  其中

  PATTERN是文字处理(Regular Expresion)的模式;

  REPLACE是代表取代成何种文字模式。

  而g是这个函数最常用的参数,代表要把所有符合文字模式的字符串全部取代,如果省略这个参数的话,则只取代一个符合文字模式的字符串中;

  而加上e这个参数代表要将REPLACE的部分当成一个运算式,如果没有这个需要的话,就不用加上这个参数了。

  说明:将符合常规表达式的字符串取成为要取代的字符串

  范例一:

  $string="i:love:perl";

  $string=~s/:/*/; #此时$string="i*love:perl";

  $string=~s/:/*/g; #此时$string="i*love*perl";

  $string=~s/*/+/g; #此时$string="i+love+perl";

  $string=~s/+//g; #此时$string="i love perl";

  上一行也可写成 $string=~tr/+//;效果都会一样哦!

  $string=~s/perl/cgi; #此时$string="i love cgi";

  范例二:

  $string=~s/(love)/<$1>/;

  第一个()内所找到的字符串变成$1,在这个范例中,会把变量love这个字符串变成,此时$string="iperl";

  $string="i love perl";

  $string=~s(i)(perl)/<$1><$2>/;

  在这个范例中,会把i变成;perl变成,此时$string=" love ";

  $string="i love perl";

  $string=~s(W+)/<$1>/g;

  (/w+)代表找寻符合一个或是多个英文字符或是数值的字符串,之后再将找到的字符串设成$1。因为加上g这个参数,所以会找到字符串的这三个英文单字,然后再把这三个单字分加上<>这个符号,此时$string="";

  范例三:

  $string="www22cgi44";

  $string=~s/(d+)/$1*2/e;

  (/d+)代表要找寻$string中一个或是多个数值的字符串,再将找到的字符串设成$1。加上参数e是代表要把$1*2当作是一个运算式,所以$string="www22cgi44";

  $string="www22cgi44";

  $string=~s/(d+)/$1*2/eg;

  加上参数e,所以会把$1*2当作是一个运算符式来看;加上参数g就会把全部符合数值的字符串经过运算式运算之后再把它取代,所以$string="www44cgi88";

  范例四:

  假设原本的字符串是$value="三八!",经CGI数据编码之后,这个字符串就会变成

  $value="¤T¤K!"。以下是一个解码的示范程序:

  $value="¤T¤K!";

  $vlaue=~s/%(〔a-fA-F0-9〕〔a-fA-F0-9〕/pack("c",hex($1))/eg;

  在传送CGI数据的时候会把数据编码,其中会将特殊字符或是中文字符编码以%开头的连续的两个十六进制数的字符串,所以要用s这个函数来找寻这个以%开头的字符串。为了要把找到的字符串再做解码的处理,所以要在%这个符号之后加上()这个符号,表示会把找到的字符串记忆起来并指定给$1这个变量,而且要在()中加上代表是连续两个十六进制数值的常规表达式(Regular Expression),也就是〔a-fA-F0-9〕〔a-fA-F0-9〕。再用hex这个函数($1是代表符合的字符串)把十六进制数值转成十进制的码,之后再用pack这个函数(以C为参数,是代表unsigned char value的意思)把这个十进制码还原成原来的字符串。最后就会把这个字符串解码成$value="三八!"。值得一提的是也可以把这个解码的程序写成:

  $value=~s/%(..)/pack("C",hex($1))/eg;

本文被浏览



 相关新闻

用Perl:痛并快乐着!!2008-01-09 16:47:50
使用Perl常规表达式进行匹配2007-05-18 15:51:05
利用Perl读写MP3标记管理音乐文件2007-05-18 15:48:48
用功能强大的Perl读写Excel文件2006-12-25 14:01:47
学习使用Perl 5.8.6 中的Unicode 特性2006-12-15 17:48:06
在Perl 中使用内联2006-12-13 15:47:54
用Perl 来创建可重用的Web应用程序2006-12-07 15:38:37


 相关评论
关于我们 | 联系方式 | 广告合作 | 诚聘英才 | 网站地图 | 免费注册

Copyright © 2001-2006 ChinaUnix.net All Rights Reserved

感谢所有关心和支持过ChinaUnix的朋友们

京ICP证041476号