Fork me on GitHub
关于正则的迷思

关于正则的迷思

正则是我们日常编程中一定会使用到的,不管是各种语言中的正则匹配,还是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}”

Image

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文档的函数对照表:

Image(1)

文档中提到的一个例子需要注意下的:

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://www.pcre.org/pcre.txt

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

Creative Commons License

本文基于署名-非商业性使用 3.0许可协议发布,欢迎转载,演绎,但是必须保留本文的署名叶剑峰(包含链接http://www.cnblogs.com/yjf512/),且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系

 
分类: 开源研究

bootcamp

热忱邀请您参加微软在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   @郝冠军

o_MVP_logo

 
 
posted on 2013-04-15 22:59  HackerVirus  阅读(255)  评论(0编辑  收藏  举报