放之四海而皆准的最早匹配原理
最早匹配和量词的最多匹配是两条基本的正则表达式匹配原则,其直接影响到表达式的运行效率甚至关系到是否能获得期望的匹配结果。重要的是,这也是所有类型的正则引擎都遵循的普适原则之一。
以表达式 go 匹配目标文本 django is elegance, go to it 的情况来说,当匹配到第一个 go 时,引擎就会停止前进,匹配结果也就是 django 中的 go。所谓最早匹配正是“第一次匹配成功,引擎即告退出,绝不多做”的意思。
而在带分支的情况下,正则引擎会先尝试所有分支条件,有一个分支匹配成功即退出,全部分支都匹配失败就前进到目标文本的下一个字符重新开始尝试匹配所有分支。这样就能保证更早地获得匹配结果(这里的“早”是指目标文本中最左边或最右边的空间概念,而非通常意义下运行效率的时间概念)。
举例来说,以表达式 ruby|python|perl 来匹配 there’re python, perl, ruby and etc 的话,结果就是 python 而非 ruby,因为正则引擎总是先尝试所有分支,有一个分支匹配成功就退出,全部分支都匹配失败就前进到目标文本的下一个字符。比较类似于程序中的逻辑短路,但表达式中分支的排列顺序对匹配结果没有丝毫影响,因为正则引擎总是返回目标文本中能满足最早(最左或最右)匹配的结果
哇,每周一讲正则表达式课程,坐沙发学习中。
hkbarton
2 Jun 09 at 12:17 am
我也准备开始我的《Android研究日志》 每周一讲了。
hkbarton
2 Jun 09 at 12:32 am
期待… 然后再让 seth 做 Objective-C 每周一讲~~~
admin
2 Jun 09 at 12:40 am
^^我来了 ~~~
我走了~~~ooO
UK
2 Jun 09 at 3:27 am
楼主让我来留言,我说我看不到。他不干。好嘛,我飘过下……
Greg
4 Jun 09 at 7:57 am