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常规表达式进行匹配

日期:2007-05-18 作者:builder.com.cn 来自:linux.chinaunix.net


  长期以来,Perl以其对常规表达式的固有支持,一直是非常流行的文本处理工具。在这篇入门性文章中,我们将带领你简单了解如何在你自己的程序中使用常规表达式,实现更加强大的文本搜索和替代功能。

  我们首先了解最简单的常规表达式:匹配。如果在字符串中找到相匹配的模式,匹配操作就返回真值。因此下面的表达式:

  $string =~ m/text/

  只有在变量“$string”中的字符串包含子字符串“text”时才返回真值。这是最基本的常规表达式,它对每个字符进行逐字匹配。当然,这只是对常规表达式作用的一个尝试。以需要查找以“ext”结尾的四个字母的单词为例。为达到这个目的,我们使用一个特殊的字符“.”,常规表达式中的句号告诉 Perl匹配其中的任何单独的字符。因此下面这个表达式:

  $string =~ m/.ext/

  将与单词“text”和“next”匹配。

  不过,这个表达式并非完美,因为它与包含“ext”的更长单词的一部分相匹配,如“dextrous”和“flextime”。我们可以使用锚字符来限制匹配的位置。“^”字符匹配字符串的开头,因此:

  $string =~ m/^.ext/

  与“dextrous”匹配,但不与“context”匹配。

  同样,“$”字符匹配字符串的结尾:

  $string =~ m/.ext$/

  与“context”匹配,但不与“dextrous”匹配。

  如果你只希望匹配以“ext”结尾的四个字母的字符串,那么你可以组合使用上面的两个表达式,像这样:

  $string =~ m/^.ext$/

  现在,如果你需要匹配一组给定的字符,而不是句号位置的任何字符,那该怎么办呢?常规表达式通过使用方括号提供一个方法。以下面的表达式为例:

  $string =~ m/^[tT]ext$/

  这个表达式只与单词“text”和“Text”匹配。一对方括号将转换其中的任何单个字符。这个功能相当强大,例如:

  $string =~ m/[aeiouAEIOU]/

  如果$string变量中含有元音,则上面的例子返回真值。

  如果括号中的第一个字符是“^”,这时它就不是一个锚字符,而是执行“非”操作,匹配不在括号内的任意字符,因此如果$string变量中只包含辅音或标点符号,可以对上面的例子进行调整,使它返回真值:

  $string =~ m/[^aeiouAEIOU]/

  方括号符号还可以指定字符的范围,让你不必列举一整串连续的数字或字母,例如,下面的例子匹配任何小写字母:

  $string =~ m/[a-z]/

  到现在为止,我们每次都是处理字符串中的一个字符,但许多情况下我们需要处理更加复杂的问题。我们使用“|”或分段操作达到这个目的。假设我们希望检查$string变量中是否含有“next”或“previous”,我们可以使用下面的表达式:

  $string =~ m/next|previous/

  如果我们希望在这个表达式中使用锚字符,那么我们需要将选项组合起来,就像在算术中使用圆括号那样。因此,如果我们希望只匹配字符串开头部分的“next”或“previous”,可以这样写表达式:

  $string =~ m/^(next|previous)/

  我们把所有这些操作符叫做原子操作符,就是说,它们与一个单独的字符相对应。不过,常规表达式的实际长度取决于操作的是循环次数。为说明这个问题,我们以确定一个字符串中是否包含一个有效电话号码为例。我们可以使用“glob”操作符,它写作“*”。许多以某种形式使用命令行的人都熟悉“*”用作通配符的情况,在Perl中它也有相似的用法,匹配任何数量的前一个字符构成的字符串。因此:

  $string =~ m/a*/

  匹配由任意个a构成的字符串。现在我们匹配任意个数字:

  $string =~ m/[0-9]*/

  这并不是我们所需要的表达式,因为它与任意数字,甚至是零相匹配。我们本可以用“+”代替“*”,它匹配一个或几个开始的那个字符,但这无法解决查找到的数字太长或太短的问题。我们真正需要的是指定循环的次数,在这个例子中为七次。这时我们可以使用大括号:

  $string =~ m/^[0-9]$/

  这个结果更接近我们的目的,它匹配包含七个数字的字符串。大括号有另外一些选项,使它们在指定循环时功能更加强大,例如,你可以指定循环范围:

  $string =~ m/[0-9]/

  这将匹配包含6个或8个数字的字符串,但如果我们用“”代替“”,就可以匹配6位或6位以上的字符串;而“”则匹配8位或8位以下的字符串。

  我们再看一下那些电话号码,现在它能够正常匹配,但仍然存在太多限制。不管什么时候,在处理用户输入时,你必须指望人们以各种方式进行简单操作。

  尝试和预见一些更加常见的电话号码格式可能是个好主意。举一个简单的例子,如号码“2391720”,它能够以“239-1720”或“239 1720”的形式输入。现在我们可以使用圆括号来匹配“-”或“”,但我们需要新操作符来处理根本没有分隔符的情况:即“?”操作符,表示前面可以有也可以没有字符。我们可以用下面的表达式匹配所有这三种格式:

  $string =~ m/[0-9][- ]?[0-9]/

  同样,我们查看一下服务部门的号码。澳大利亚电话号码中有一个两位数的区号,我们在下面的表达式中增加它们:

  $string =~ m/([0-9][- ]?)?[0-9][- ]?[0-9]/

  这个表达式可以匹配“02 114 7682”这样的电话号码,而且,因为我们把区号部分放在圆括号中,使它成为可选内容,所以这个表达式还可以匹配前一个表达式匹配的格式。我们还可以做出更多改进,如把区号放在“(”和“)”中;但是,如你所见,你在表达式中增加越多选项,表达式就会越长越复杂,因此到底是否增加更多选项,由你自己决定。

  下次我们将深入讨论常规表达式的用法,包括替代、转换和如何建立你需要的Perl常规表达式程序。

本文被浏览



 相关新闻

利用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
用Perl管理 Linux 配置文件2006-12-04 15:32:25
Perl在用于系统管理的cfengine中应用2006-11-29 16:29:38


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

Copyright © 2001-2006 ChinaUnix.net All Rights Reserved

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

京ICP证041476号