正则表达式学习的故事

[size=large]
做为程序猿,我们肯定或多或少的使用过正则表达式。
这时候你可能去网上拷贝一段代码,像验证邮箱,验证网址,验证只包含数字或
字母的密码等,copy很容易。但是你想过要多学点正则的东西了吗?或者你从学
习某一门编程语言的过程中接触到了一些,但是感觉还是不够用,想多学点。如
果真的是这样的话,我建议你去看书吧,因为这时候一本完整介绍正则的书籍带
给你的收获比网上零碎的知识介绍要好很多。当然如果你感觉你用的不多不需要
学。没关系,兴趣和好奇心最重要,等到有兴趣的时候再去学习吧。

这里我总结一下我学习正则的心得。
[list=1]
[*]我要好好学习正则部分:

我下定决心好好学习正则的想法还是来源于我在学习编程的过程中功能碰到
问题需要解决。但是在我把眼前的问题解决后,我在想为什么要用正则来解决这
个问题。比如碰到验证一个字符串里只包含数字或字母的情况,如果不用正则要
怎么处理,如果用了正则怎么处理。比较后我发现正则里的元字符太厉害了。我
当时就想正则里还多少元字符?抱着这个想法,我首先去看了java中的regex类的
文档。因为我是最先学会使用java这门编程语言的。但是我看了之后,并没有真
的懂正则表达式。最多的收获只是多强迫自己学了几个java中正则的元字符而已。
现在回想起来,如果当时有人介绍我去看《精通正则表达式》这本书的话,可能
我会收获更多。也许那本书当时还没翻译成中文,介绍给我估计也不敢看!! :D

在我以为我自己对正则有所了解的时候,我接触到我的第二门语言-javascript。
因为当时写一些网页程序的时候,发现偶尔也会碰到正则。但是我用的时候,
发现在java里能用的正则表达式字符串直接copy到javascript里使用就有错误。不
一样的语言,不一样的正则——的确这个观点看起来是对的。但是为什么会这样,
他们为什么有些地方是一样的,而有些地方是不一样的。这个问题后来真正的得
到解释是在了解了下正则表达式的发展史,知道编程语言把这些东西集成到自己
的语言里并加以改造之后才造成的。所以在众多支持正则的工具或语言里都存在
着些许细节的不同。在最全面的正则表达式语言里,能提供的功能就那么多,别
看《精通正则表达式》这本书这么厚。

在我参加工作一年后,我自己隐约感觉到我要系统的学习下正则表达式,然后
我在Amazon上就找到了《精通正则表达式》(Jeffrey E.F.Friedl著,余晟译) 这
本书,忍不住要赞下,这本书的作者和翻译者都不错,在国内出版和翻译都一团
糟的情况下,能看到这种水平的东西真的很欣慰。

[*]真正学习正则部分:

按照《精通正则表达式》这本书的章节构造,我循序渐进的去看了这本书,
在短期内就有好多收获。

我认为要学好正则的话,基本以下东西你最好能知道.

1.懂一些字符编码的知识,并知道在正则里怎么运用。


这些知识不是你常用的,但是我放在第一位。是因为它很重要。
一般,我们所使用的正则引擎都是嵌入在某一门编程语言里或工具里,那么
该编程语言或工具对字符的编码就决定了所写的正则能支持多少编码。当我们真
的要关注编码的时候,会遇到正则引擎能识别这种编码吗?正则引擎是采用哪种
编码来处理这种编码字符的,对这种编码支持程度是多少等等一些问题?不过在
一般的编程中我们基本不需关心编码问题。现在的编程语言大多数都是支持
unicode编码的。而嵌入的正则引擎也是支持unicode编码的。

2.常用元字符要熟记。至少熟记常用的语言里的常见元字符写法。

像“\d”可以匹配0至9这10个数字一样,正则里有非常多的这样的元字符,不
过也没有多到让人害怕的地步。只不过略微与点让人不爽的地方就是不同的编程
语言在支持同一种正则意思的过程中产生了不同的表达式写法,就是我们所谓的
方言。在你不确定的时候需要去查下资料才能确定。如果如上这些对元字符的描
述让你认为你已经了解正则的元字符的话,那我表示抱歉。在元字符这一块还有
一些东西,比如说一般我们匹配的是字符,而有时候我们需要匹配的是位置,比
如在hello和word之间的位置,行首位置,行末位置等。还有如一些表达匹配程度
的量词元字符,如+表示至少要匹配到一次,*表示要匹配0次到多次,?表示要
匹配0到1次等。眼睛看的见的字符,看不见的字符都有对应的元字符来匹配它。
可以说元字符是我们学习正则的第一步。记住常见的元字符,我要记住常见的元
字符 。

3.知道如下这些不常见的元字符

反向引用(或捕获)元字符,环视元字符,注释元字符,非捕获分组元字符。

这些知识点基本还是元字符章节里的内容。在不同的语言里元字符的写法不
同,有些还是不支持的。这个具体要用到的话,要参考相关的文档。


4.转义

转义这个东西,用的比较多的是当我们在文本里有类似元字符字样的字符,
如\d,我们的正则表达式不能也写成\d,怎么办?这时候就是要转义,把元字符转
换成普通字符,在java中基本就是\\d,在一般的语言里转义基本是反斜线来表示
的,所以在元字符前面加个反斜线就可以了。这个是我的理解,其实还有一种解
释就是d是普通字符,转义下,\d表示元字符,再转义下变成了\\d。\\是转义的
转义。不管怎么样,能理解就行。因为平时我们碰到的元字符不一定都是类似这
种带反斜线的表示,如表示行首行尾位置的^和$等。

5.替换

替换不是正则的功能,但却是编程语言集成正则后的最实用的功能。

6.陷阱

在了解元字符的基础上,想要精准的使用它们,你要学习如何避免陷于各种
元字符所设下的小陷阱,这个并不是说元字符有问题,而是你运用这些元字符的
时候,你的逻辑很可能会出现问题。关于这个知识点有很多东西,在你看这本书
的时候,作者对元字符讲解的时候会罗列出来这些小陷阱,注意点它。当你下次
不小心碰到了,没关系,下下次就记住了。反正是逐步学习深入的过程吗!!

7.建立自己的正则库。

在平时工作过程中,可以收集一些正则表达式库的网站。给你提供方便实用。
有两个好处,
a.验证你写的正则表达式对不对;
b.寻找常见的正则表达式。还得提醒一句, 如果你发现了网站上的正则
有问题的话,就要自己修正这个些问题了。并且把修正好的正则也贡
献给网站,做好注释,方便他人。
[/list]
这里只是做个简单的总结,对于想学正则的朋友来说,自己去看书学习,收获
是最大的。对了,如果大家想用vim这种编辑器的话,正则更是要懂的。
[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值