正则表达式

来源:互联网 发布:大淘客cms收费吗 编辑:程序博客网 时间:2024/04/29 09:02

1.1      简介

RegularExpression(简称regexpRE)是什么?有人直译为「正则表示式」。Regexp是一组大约三四十个特殊符号,只要学会其中常用二十来个,就能搜寻字串/代换字串,甚至完成许多滑鼠选单做不到的惊奇繁杂工作。以下举一些例子;为让您专注于regexp本身,暂时不写出完整的指令,只写出指令中关于regexp的那一小段。

1)英文的"颜色"一字,有两种拼法:colorcolour。用regexp表达,可以一石两鸟:colou?r其中的?表示「前面的字元可有可无」

2)想要找"port""ports",但又不希望找到"export""portable""important"等等一大堆不相关的单字,该怎么办?/bports?/b这里的/b表示「(文数字vs。标点符号等等其他字元之间的)边界(boundary);旁边不可有其他文数字」。所谓文数字,就是英文字母,数字,及底线"_"

3)在一篇文章当中,抓出所有「看起来像是机场代码的字串」(例如TPE台北,KHH高雄,LAX洛杉矶,...等等):/b[A-Z][A-Z][A-Z]/b。这里的[A-Z][ABCDEFGHIJKLMNOPQRSTUVWXYZ]的简写,意思是「任何一个大写字母」

4)如何在一大片文字,银行帐号,信用卡号...当中,找出看来像是行动电话号码的字串,例如0912345678或是0912-345678或是0912-345-678之类的?09/d/d-?/d/d/d-?/d/d/d这里的/d[0-9]的简写,这又是[0123456789]的简写,意思是「任何一个数字字元」

5)想要找一组数字ip(例如16895111631757之类的)印象中在某个档案内曾看过,但既不记得精确的数字,也不记得在那个档案看过,该怎么办?可以搜寻/d+//d+//d+//d+抓出所有数字ip。这里的+表示「前面的东西,可以重复出现1次,2次,3次,...任意次」。因为。在regexp当中有特殊的意义:「任何一个字元」;但在这里我们就是要找""于是在前面加上/以取消它的特殊意义。

6)可以把一个文字档里面的所有空白列都删掉吗?这个regexp可以抓出所有空白列:^/s *$。在regexp最前面放一个^表示您只对「出现在一列之首」的样版有兴趣;regexp的最后面放一个$表示您只对「出现在一列之尾」的样版有兴趣。/s[/t/n]的简写,意思是「任何一个空白字元」(包含空格,tab,等等) *表示「前面的东西,可以重复出现0次,1次,2次,...任意次」。这个样版翻译成中文,就是「从头到尾都是一片空白的那种列」。

1.2      Regexp的应用

Linux平台下,grepsed等众多命令支持regexpPerl的命令行应用也能使用regexp来解决一些事情。在C++应用中有BoostRegex的库。

以下进行实战演练!

在项目中我们增加了通过IPCUUID)恢复文件索引(MediaIndex)的功能,其中有个与regexp相关的过程,就是查找IPC所属的文件。因为多数情况下IPCs共享一个硬盘分区,我们要在众多IPCs的文件中找到我们所需IPC的文件,而且这里还要排除有其他混杂文件的存在。这里我们可以使用regexp来把我们需要的文件从文件列表中抓出来。

文件名格式

XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX_YYYYMMDDTHHMMSS

XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXUUID

YYYYMMDDTHHMMSS:年月日“T”时分秒

构造regexp

^/w{8}-/w{4}-/w{4}-/w{4}-/w{12}_/d{8}T/d{6}$

“/w”表示单个英文字母或数字,“{}”表示前面的一个字符重复的次数,作用到“/w”等上也是同样的效果。这里采用“^$”算是一种全匹配,避免出现“AAXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX_YYYYMMDDTHHMMSSbb”这样的情况。

获取文件列表

当时ls...“|”管道将结果传给后一个命令。

匹配内容

貌似grep是不支持“/w”等的符号,改成“[]”是可以匹配的,"/w"将其替换成“[0-9a-zA-Z]”“/d”自己想吧,反正就是太长太麻烦了。这里用Perl来演示一下,主要是表现一下正则表达式的作用,不需要关注Perl的用法。

ls的结果

匹配后的结果

Perl支持通过()将表达式中的某些项目抠出来,通过$1$2这种内建变量来访问($0默认是给定表达式匹配的全部部分)。BoostRegex提供了Perlregexp的这种特性,通过match_results来存放这种匹配的结果,也是通过类似的数字序号索引来访问。

原创粉丝点击