Perl之正则表达式基础(四)

接上一篇 ,继续介绍关于Perl中正则表达式稍微高级点的话题。

列表上下文中的m//
在列表context中使用模式匹配(m//)时,如果匹配成功返回值为内存变量值的列表;如果失败则为空列表,例如:


在s///中介绍的/g、/i等修饰符也可用在m//中,它允许你在字符串中的多处进行匹配,例如:


我们还可以将返回的字符串放入hash中,例如:

 

非贪婪的数量词

已经出现过的四个数量词(*、+、?和{ })都是贪婪的。它们将最大限度的匹配,而非在匹配成功时即立刻返回。使用贪婪的数量词的问题主要在于:可能会使正则表达式引擎做大量的不必要的回退(backtracking)操作。因此,需要一种非贪婪的方法。

 

贪婪    非贪婪

   *            *?

   +           +?

   ?            ??

   {,}           {,}

 

匹配多行文本

通常,正则表达式是针对单行文本的。锚定^和$是指整个字符串的开头和结束,但/m这个正则表达式选项允许它们根据内部的换行符进行匹配。这时锚定针对每一行,而非整个字符串。如下面的例子中,我们将整个文件读入一个变量中,然后将文件名字加在没一行的开头处:

 

更新大量文件

特殊变量$^I:备份文件的扩展名。

 

在命令行中进行修改

perl -p -i.bak -w -e 's/old/new/g' *.dat

Perl有完整的命令行选项,通过它们只需在命令行中输入几个字符,就能构建一个完整的程序。

-p:要求Perl为你写一个程序,虽然算不上完整,看起来像下面:

-i.bak:在程序中将$^I的值设置为“.bak”,如果不需要备份,可以使用-i参数,后不接任何扩展名。

-w:将警告打开。

-e:执行下面的代码,即这里的s/old/new/g字符串被当作Perl代码执行。由于我们有while循环(-p选项),这段代码被放在循环内,print之前。

*.data:指定此模式作用的文件名。

上面几部分综合起来,类似下面的程序:

Perl的命令行选项也是很好很强大的哦!

 

非捕捉用的括号

在正则表达式中,括号通常起分组和捕捉匹配上的字符串的作用。

如果只想用括号将某部分进行分组,不希望获取匹配的字符串,我们可以在开括号的后面加上一个问号和冒号,即?:。其作用是告诉Perl,括号只是分组的作用,如/(?:an)?/s*(apple|banana|orange)/。

 

有关Perl正则表达式的基础知识就介绍这么多,这一系列也将在此告一段落。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值