Crane
Table_bottom

Search
Loading
Table_bottom

分类
Table_bottom

随机文章
Table_bottom

标签云
Table_bottom

最新评论
Table_bottom

链接
Table_bottom

功能
Table_bottom

正则表达式之一

我想从Linux开始说起,他继承了Unix的设计思想,Keep it simple,由一个内核和许许多多小工具组成,内核负责管理资源,工具负责完成作业,彼此配合,实现人们需要的功能,提供人们所需要的服务。由simple的原则,每一个工具只专注少量的工作,他们通过配合,是的,他们可以配合的很好(这是和windows完全不同的地方),所以每个工具只需要解决好自己真正要干的活,别的事不用担心,会有工具负责的,相当于包产到户,产量绝对有保证。

也正是由于simple原则,linux里面的所有配置文件都是纯文本格式,这样只需要一个文本编辑器就可以搞定所有的配置,这样的话系统管理员在命令行界面下就可以干完他大半的工作,但是面对一大堆的文本,要找出自己想要的东西也不是一件容易的事,要是你知道确切的要找的内容,那么一个简单的search就办到了,但是若是你要找一类相似的东西,比如E-mail地址,URL等,它就无能为力了,这下就是正则表达式出马的时候了,它有强大的匹配功能,通过描述字符串的特征,可以轻易帮你找到你想要的东西,所以现在几乎所有的只要是处理字符串的工具(文本编辑器、文字处理软件、系统工具、数据库引擎等),编程语言(Java、JScript、Visual Basic、VBScript、JavaScript、ECMAScript、C、C++、C#、elisp、Perl、Python、Tcl、Ruby、PHP、sed和awk等),都支持正则表达式,也正是有了正则表达式,程序员可以提高效率,使得生产力又得到了极大的提高。

其实从低层面来说,正则表达式描述的是一串文本(a chunk of text)的特征。读者可以用它来验证用户输入的数据,或者也可以用它来检索大量的文本。从较高的层面上来说,正则表达式容许用户掌控他们自己的数据—— 控制这些数据,让他们为自己服务。掌握正则表达式,就是掌握自己的数据。

你也许使用VIM写程序,想搞清楚它那语法高亮是怎么实现的;也许看到过类似[a-zA-Z_][a-zA-Z0-9_]*之类的东西,不知道前面这串看似很乱的东西是什么;也许你的程序要处理一些数据,你想要得到其中的E-mail地址,但不知道程序应该怎么走;其实这些全是正则表达式的能力范围。

就说上面写到的那个简单的正则表达式的例子吧!那个表示的是匹配变量名,我们都知道变量要以字母或下划线开始,然后其余可以是字母,数字或下划线。为了看懂上面那个例子,有必要了解一下正则表达式的一些基本常识。

在正则表达式中,怎么描述一串文本的特征呢,它有一套规定,规定一些字符代表特定的意义,就是术语中所说的元字符,用元字符和普通字符配合起来描述字符串,下面就是一些基本的元字符。

^        匹配一行的开始(单独使用)

[^?]        匹配除了?(?表示的是不希望匹配的一个列表)以外的任何一个字符(在[ ]内使用)

$        匹配一行的结尾

[avdee]        匹配中括号的任意一个字符,[ ]里面也可以用一个”-“表示范围,像下面一样。

[a-z]        匹配一个小写字母

[A-Z]        匹配一个大写字母

[0-9]        匹配一个数字

.        匹配任意字符

|        匹配这个字符左边或右边的部分,通常写成“(word1|word2)"的形式,同时这个括号里的东西算一个整体,他们是一个部分。

+        匹配这个字符前面的部分至少一次,这个部分要不是一个字符,要不就是上文所说的部分,不一定是上文那种形式,只要是在括号中就行,下同。

*        匹配这个字符前面的部分任意次,可以为零次

?        匹配这个字符前面的部分零或一次

\<   \>        分别匹配一个单词的开始和结尾,这样就可以用这两个的组合来匹配一个单词

\元字符        匹配元字符,要不然它们会被按照它们所代表的意义处理

先来热一下身,比如^cat, ^ 表示一行开始,然后紧接着是一个单词 cat ,所以它表示的是以cat开头的行,类似的 cat$ 表示以cat结束的行,而 ^cat$ 则表示只有 cat 一个单词的行,再比如你不知道奶酪应该怎么拼,是cheese呢还是chease,可以这样写che[ea]se,中间的[ea]表示这里可以是e或者a,也许你觉得这样看着不明显,没关系,可以写成这样(cheese|chease),用到了”|"这个元字符,表示匹配左边或右边的部分。或者你不知道cheese中间是一个e呢还是两个,可以这样写che+se,注意这里是+号,表示至少应该有一个,若是*的话,表示可以一个e都没有,或者有好多个,而是?的话则表示是有e呢还是没有。

下面来看上面那个例子,[a-zA-Z_][a-zA-Z0-9_]*

可以看到这个可以分成三个部分,前面两个中括号中的各是一个部分,后面那个星号是一个部分。参考上面的规定,可以知道第一个部分表示的是第一个字符是个字母或下划线,后面的就是任意字母或数字或下划线,那个*表示长度不限,这正是变量取名的规则,所以它匹配的是变量名。

 再来一个例子,比如说要匹配一个时间,像这样的:"9:17 am" or "12:30 pm",如果说写成这样:[0-9]?[0-9]:[0-9][0-9] (am|pm),是可以匹配出我们想要的时间,但也会有我们不需要的,像99:99 am之类的错误也会带进来,因此我们要注意每一位的范围,然后就可以写出像这样的:(1[012]|[1-9]):[0-5][0-9] (am|pm),就可以符合要求了。如果要匹配24小时制的话,同样考虑范围问题,可以把前面的换成[01]?[0-9]|2[0-3]就可以匹配24小时制了。

其实这只是用正则表达式来牛刀杀鸡,它的强大功能还多着呢!

看到一则linux推广活动有感

今天从楼下过的时候照常顺便扫了一眼那个一向什么都贴的Board,虽然大多时候以广告居多,但偶尔也不乏一些有趣的东西,为了这些昙花一现的东西,我已经养成了每次过的时候都快速scan一遍的习惯。

一般只有大块的宣传才能引起我的注意,但是今天仿佛冥冥之中注定的一样,让我看到了一个传单,普普通通,A4大小,白底黑字,在一大堆花花绿绿的广告中很不起眼,但却抓到了我的眼球。或者更合理的解释是,是那一大堆Logo吸引了我的注意,的确,要让一个小传单能尽可能的吸引眼球,就要让它尽可能的被图片占满,而不是文字,否则它就会像戈壁上的一粒沙一样。说远了,拉回来,那是一张linux协会活动宣传的传单,只有大号的几个字的标题-走进酷炫的linux世界,其余的全是各种各样的linux 发行版Logo,正是这些熟悉的Logo引起了我的注意,走近仔细看一下,了解情况了,是linux协会搞的一个linux入门的活动,或者不应该说是linux入门,仅仅是告诉众多依然在用windows(尽管今年windows发生了如此之多的事情)的人们linux的好处,或许可以让一部分人迈出从windows到linux的一步。活动内容主要是介绍linux(尽管这个东西已经出现了有十几年了,但现在高校除了计算机系的,其他同学知道的人就不是很多了),展示linux的酷炫效果(估计是想震撼那些说linux就是个黑咕咚咚的东西,远没有vista的漂亮的人),估计就是compiz或者beryl吧,compiz比较好配置,八九不离十应该是compiz了。

看到这里,我有些想法,估计看了这个活动演示,会有一大帮人喊着要装linux,why,just for the visual effect!这样的人很多,在计算机系也有很多,对于他们而言,他们把linux不当一个操作系统来看,只把他当作一个好玩的玩具,有的甚至抱怨那玩意怎么那么大,却不想想windows也占了这么大硬盘空间的时候什么也干不了,只是一个光秃秃的裸系统,而linux这样的时候已可以干很多事情,日常应用基本可以满足了(说基本是因为好多人的日常应用就是QQ和游戏,这在目前的linux下是不太现实的,因为linux虽然现在有了桌面系统,但他的强项不在这里,当然还争不过业界老大Microsoft,那个一出生就会了满足个人用户应用而生的大佬,几乎所有的PC游戏都是windows平台的),甚至可以用好几种方法来完成同一个任务,你可以根据自己喜好选择一种方法来干自己想干的事情。可以这样说,只有越深入linux,越能感觉到它的深隧,它的无所不能(处理作业方面,不是娱乐方面)。但是现在人们只被表面的事情所吸引,很少人深入地多想一些,深入地钻研一些问题,就像这个例子里面,当玩完了特效,玩完了linux发行版带的游戏,接下来该用linux干什么了,没有了,那要它也没用了,格了吧!这就是linux在好多人机器上的命运,而且我相信这个现象仍会继续,只有浮躁的风气还在。

好像现在电脑越来越成了一个娱乐工具,尤其是在青年人手里,电脑充其量是一个高级游戏机,影碟机,MP3等。每天上网第一件事,QQ,然后开个网页,或者暴风看电影,要不就打开个游戏客户端,我想这样经典的行为已经囊括了大约60%以上的网民吧!

在高校呢,就像我们计算机系,电脑里依然是满目的盗版的windows,office,以及其它各种各样的盗版商业软件,固然这是一种悲哀,但我们难道无能为力吗?不是的,至少我们可以开始改变,因为这个世界上不只一种操作系统,为什么我们一定要选那个最贵且最不适合我们学习的呢?像我们计算机系的,学习各种专业课都离不开实践:C语言,linux下的开发环境远比windows下的强大,各种工具应有尽有,最好的编辑器,一流的编译器、调试器,远比windows下臃肿的IDE强大,你只需要专心代码,其余工作有专门的工具自动完成,而且这一套东西只要你学习一样,其余的都可以很快上手,这样又可以节省不少时间来做更多的事;汇编,同样也有相应的编译环境;操作系统就更不用说了,在windows下根本不知道他的工作原理,而linux就不一样了,不但文档完善,而且还有源代码,这是windows远远不能比的,想了解操作系统哪里,都可以看文档,甚至直接看源代码,这样对学习是很有帮助的。

好多人对linux敬而远之的原因是那个黑呼呼的东西不友好,现在有了桌面系统,情况好些了,但对于学计算机的来说,GUI虽然好,但cmdline那个东西下隐藏了更为强大的生产力,或者说隐藏了更为强大的内功,我们应该拥抱它才对。