专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Linux » perl正则表达式:使用Perl常规表达式进行匹配 »正文

perl正则表达式:使用Perl常规表达式进行匹配

来源: 发布时间:星期四, 2009年2月12日 浏览:30次 评论:0


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

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

  $ =~ m/text/

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

  $ =~ m/.ext/

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

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

  $ =~ m/^.ext/

  和“dextrous”匹配但不和“context”匹配

  同样“$”匹配结尾:

  $ =~ m/.ext$/

  和“context”匹配但不和“dextrous”匹配

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

  $ =~ m/^.ext$/

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

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

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

  $ =~ m/[aeiouAEIOU]/

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

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

  $ =~ m/[^aeiouAEIOU]/

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

  $ =~ m/[a-z]/









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

  $ =~ m/next|previous/

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

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

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

  $ =~ m/a*/

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

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

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

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

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

  $ =~ m/[0-9]/

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

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

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

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

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

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

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

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



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: