关于正则的迷思
正则是我们日常编程中一定会使用到的,不管是各种语言中的正则匹配,还是linux/unix系统上的grep/egrep命令,都是在使用正则来匹配字符串。随着用的深入,可能会感到越来越迷惑:
为什么有的语言要提供多种正则匹配的函数集?
-- 比如php的preg系列和ereg系列
为什么有的正则语句在不同的语言上匹配出来的东西是不一样的?
-- 比如unix的grep命令和perl语言的grep
故事从头开始讲
正则表达式(Regular Expression)从1956年就开始出现这个概念,后来Unix之父Ken Tompson将这个概念引入Unix,出现了grep工具。但是随着Unix的版本不断演化,Unix的差异也越来越大,一统江湖的POSIX标准就此出现。POSIX(Portable Operating System Interface for uniX)提供的是统一的Unix接口,当然也把正则这块统一了。于是出现了Posix的两种标准:POSIX Basic Regular Expressions (BRE)和POSIX Extended Regular Expressions(ERE)。
BRE就是现在unix系统使用的grep命令,ERE就是现在unix系统使用的egrep命令。ERE就是BRE的扩展包的意思,基本语法都是一样的,但是两者还是有一些区别,比如对于一些特殊符号,“{ }”是否需要使用反斜杆:
要匹配“tt”,在BRE中使用“t\{1,2\}”,在ERE中则是使用“t{1,2}”
BRE和ERE还有的区别就是ERE多了+,?。具体可以看这篇文章:http://www.regular-expressions.info/posix.html
PS:现在网络上说的正则,如果没有特殊说明,应该都是指的是ERE。它也是现在使用最广的正则了。
PS2:grep -e就和egrep是一样的。
故事继续
如果世界上的正则只有一种标准,那一切看起来都这么完美,但是在计算机世界总是有各种各样的历史问题。
有很多种语言也自己定义了一套正则标准,虽然大体上和POSIX的这套很像,但总还是有一些不同的细节的。比如Perl,python,Tcl(Tool Command Language)。都有自己定义的一套正则标准。其中Perl的正则到现在演化成为PCRE(Perl Compatible Regular Expressions)。这个正则语法也是被php所采用的。
GNU grep,linux机器上使用最广泛的正则语法,几乎所有的linux机器上的grep命令都是GNU grep。它和POSIX是一致的,有GNU Basic Regular Expressions 和GNU Extends Regular Expressions。
关于各种版本的正则的不同可以查看这篇http://www.greenend.org.uk/rjk/tech/regexp.html
PHP中的正则
PHP中有两套正则函数集:preg和ereg (如果你算上mb_ereg那就有三套)
preg和ereg分别代表的是PCRE regular Expression和Posix extension regular Expression。preg和ereg有一些不同,最大的不同就是preg有“分隔符”(一般是\或者|)来将正则表达式划出来。还有就是preg是没有大小写不同的函数的,它使用“模式修饰符”来对大小写进行匹配。下面是摘自php文档的函数对照表:
文档中提到的一个例子需要注意下的:
one(self)?(selfsufficient)? 匹配字符串“oneselfsufficient ” 在ereg是会匹配出oneselfsufficient的,但是在preg是匹配到oneself的。就是说posix会尽可能的匹配正则,而对于这种可“多种”匹配的正则,pcre的选择更为保守。
Go中的正则
go中的正则包是regexp,它使用的是叫做RE2(https://code.google.com/p/re2/wiki/Syntax)这个C++写的库,这个库支持了两种标准:Perl 和 POSIX
在函数中也有体现
MustCompile
MustCompilePOSIX
所以呢,下面这个代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package main import( "regexp" "fmt" ) func main() { var origin1 = `tt` var reg = `t\z` matches1 := regexp.MustCompile(reg).FindString(origin1) fmt.Println(matches1) /* matches2 := regexp.MustCompilePOSIX(reg).FindString(origin1) fmt.Println(matches2) */ } |
\z是只在perl的正则语法存在,表示以t为结尾,在POSIX中没有,所以如果你把注释的部分放开,这个程序就会抛出panic
go的RE2支持哪些语法可以看https://code.google.com/p/re2/wiki/Syntax 这个页面说明
参考文章
http://www.regular-expressions.info/php.html
http://www.regular-expressions.info/posix.html
http://blog.csdn.net/cheungjustin/article/details/5897982
http://baiy.cn/utils/_regex_doc/
http://www.greenend.org.uk/rjk/tech/regexp.html
http://blog.csdn.net/cheungjustin/article/details/5897982
http://en.wikipedia.org/wiki/Regular_expression#POSIX_Basic_Regular_Expressions
http://www.greenend.org.uk/rjk/tech/regexp.html
http://baiy.cn/utils/_regex_doc/
http://www.php.net/manual/zh/reference.pcre.pattern.posix.php
http://hi.baidu.com/csisno1/item/0ef7c10eec298b103a53ee5a
http://www.softpanorama.org/Tools/Grep/grep_minitutorial.shtml
本文基于署名-非商业性使用 3.0许可协议发布,欢迎转载,演绎,但是必须保留本文的署名叶剑峰(包含链接http://www.cnblogs.com/yjf512/),且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系。
热忱邀请您参加微软在4月27日举办的Global Windows Azure BOOTCAMP - 北京站。这一天,微软资深专家将带领您学习和了解关于Windows Azure 的 方方面面。开始您的Windows Azure之旅,即便您还对Windows Azure 不太 了解也没有关系,讲师已经精心准备了相关课程,引导您学习和了解非常棒的 Windows Azure 。值得提醒同学们的是这么激动人心的Azure课程是完全免费的。为了让您可以快速的进入Windows Azure的开发和学习,我们建议您可以事先参考相关内容资料。同时当天参与的同学还将有机会获得Windows Azure Pass,最先体验微软云! 追赶全球步伐,就来免费体验和学习Windows Azure 吧,我们一起漫步在云端!
报名地址:http://aka.ms/azurebeijing
活动地址:北京市朝阳区望京街利星行广场微软大厦3层
活动时间:2013年4月27日下午1点
日程安排:
主题 |
讲师 |
|
13:00 – 13:30 |
签到、交流 |
Beijing UG Lead |
13:30 – 13:40 |
Welcome |
Beijing UG Lead |
13:40 – 17:10 |
Windows Azure State of Union Building Web Application with Windows Azure Web Sites Demo …… |
Nevin Dong (TECHNICAL EVANGELIST, DPE, Microsoft) Ziyan Xu (Microsoft MVP, Windows Azure) Xing Fang (TECHNICAL EVANGELIST, Azure CSV – China, Micorsoft) |
17:10 – 17:30 |
Q&A,抽奖 |
Speaker, MVP, UG Lead |
其他报名方式:
你可以加入Azure QQ群进行讨论34996824
● 登录网站报名 http://aka.ms/azurebeijing
● 将你的姓名 手机 邮箱 公司单位 职务
● 发送邮件到 msbeijingcommunity$live.cn
● 如果有任何问题请联系活动组织者:冯瑞涛、郝冠军
更多信息:
● 如果您不在北京,在国外您可以选择您附近的社区活动:
● 全球Azure活动站点:http://globalwindowsazure.azurewebsites.net
● Azure中文介绍资料:http://aka.ms/ziliao
● 活动讨论区:http://aka.ms/discussion
本次活动完全免费,名额有限速速报名来参加吧!
4月27日当日在世界范围内60多个地区同时举办!
如果对本次活动有任何问题,可与微软MVP组冯瑞涛、郝冠军联系,新浪微博 @冯瑞涛TerryFeng @郝冠军