• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

perl常用正则表达式集合

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

本文罗列了一些常用的正则表达式,不间断更新中。。。

s/^\s+//

去除尾部空格

s/\s+$//

去除前后空格

s/^\s+|\s+$//g

匹配任意字符

/.*/s

这里/s表示连换行符也匹配,因为.是不匹配换行符的,所以上面的表达式匹配任意字符。下面看第二种方法,perl中的元字符.能匹配所有单个字符,但是不能匹配换行符,如果要匹配的文本含有换行符,那么.将无法胜任,比如下面的xml文件。

<Response>
<Code>200</Code>
<Description>Success</Description>
</Response>

如果想取得Response结点中的内容,那么下面的表达式无法完成工作,因为两行文本中间有一个换行符。

<Response>(.*)<\/Response>

那么如何匹配任意字符呢?可以用下面的正则表达式

[\d\D]

\d表示数字,\D表示非数字,数字加非数字也就是所有字符了。当然还可以使用[\s\S]或者[\w\W]等等,所以上面那个匹配可以写成

<Response>([\s\S]*)<\/Response>

返回所有匹配

假设有如下xml文件,我们想返回所有step之间的文本,这里即abc和xyz。

<Steps>
<Step index='1'>abc</Step>
<Step index='2'>xyz</Step>
</Step>

那么可以使用下面的方法

my@result=$text=~/<Step.*?>(.*)<\/Step>/g ;

解释一下,<Step.*?>匹配abc左边的内容,为防止*匹配到本行末尾,我们使用其懒惰型版本*?,(.*)匹配abc,这里使用了分组,这样结果才能存放到result数组里面,<\/Step>匹配闭合的Step,由于/是模式的分隔符,所以需要转义。

/(fred)*/能匹配Hello, world!么?

能,因为模式串/(fred)*/表示目标串中有0个或者任意个fred,而Hello, world含有0个fred,所以符合要求。

匹配任意数字

十进制数

/^\d+$/

这个很简单,没什么说的,注意这里匹配的是单独的数字串,也就是一个数字独立作为一行出现。而不是出现在其他字符串中的数字。所以要加行的起始符和结束符。如果想要在一个长字符串中找出数字,那么可以使用\b作为单词的边界符。可以使用下面的正则表达式

/\b\d+\b/

八进制数

/^0[0-7]+$/

八进制数是以0开头的,还要注意八进制数中基数最大是7,写成/^0\d+$/是不对的。

十六进制数

/^0[xX][\da-fA-F]+$/

十六进制数以0x或0X开头,字符可以是0-9或a-f(A-F)。注意这里没有处理字母大小写混合的情况,所以0x12aBcD也是合法的十六进制数。如果要保持大小写一致的话,可以使用下面的表达式。

/^0x[\da-f]+$|^0X[\dA-F]+$/

匹配任意数字

将上面的十进制,八进制和十六进制联合起来即可。

/^\d+$|^0[0-7]+$|^0[xX][\da-fa-F]+$/

注意不能将^和$提取出来作为公共部分,下面这样写是不对的

/^\d+|0[0-7]+|0[xX][\da-fa-F]+$/

因为|会将它前面所有字符作为一个模式,所以^\d+成了一个独立的模式,这样导致只会匹配字符串开头一个十进制数,同样也只会匹配结尾的一个十六进制数。这显然是不对的。如果非要这么些,可以将模式加上小括弧作为一个分组,像下面这样。这样写貌似也不对,需要继续研究。

/^(\d+)|(0[0-7]+)|(0[xX][\da-fA-F]+)$/

====


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
AWStats是一个基于Perl的WEB日志分析工具。发布时间:2022-07-22
下一篇:
perl学习笔记——字符串和排序发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap