科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件使用Perl常规表达式进行匹配

使用Perl常规表达式进行匹配

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文将带领你简单了解如何在你自己的程序中使用常规表达式,实现更加强大的文本搜索和替代功能。

作者:builder.com.cn 2007年3月13日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

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

$string =~ m/a*/

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

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

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

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

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

$string =~ m/[0-9]{6,8}/

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

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

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

$string =~ m/[0-9]{3}[- ]?[0-9]{4}/

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

$string =~ m/([0-9]{2}[- ]?)?[0-9]{3}[- ]?[0-9]{4}/

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

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

责任编辑:德东

查看本文国际来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章