关于正则的迷思

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

时间: 2024-10-28 12:06:23

关于正则的迷思的相关文章

关于数字化转型的五个迷思

你也许对数字化转型是什么略有耳闻,但是数字化又不是什么呢?看看专家如何破除关于数字化业务运营的迷思并解释为什么仅凭IT是做不到的. 如今,IT经理们在数字化他们的机构时感到压力时是情有可原的. 学者,调研公司,甚至是本媒体都在推广这样的想法,就是机构可以大大地改善绩效并战略性地将数字技术应用到机构和运营的过程中,从而开辟崭新的业务范围. 尽管有着铺天盖地的宣传和数十年的IT基础设施的投资,只有很少的公司达到目的. 在196位回应<计算机世界>的2017年技术预测调查报告的IT经理,董事和总裁中

私有云之迷思:未来是什么?

本文讲的是私有云之迷思:未来是什么?,[编者的话]非常好的一篇文章,作者从OpenStack目前的困境讲起,聊到了私有云的产生背景,进而介绍了云计算的发展史.从云计算诞生的初衷以及现在流行的分布式应用又延伸出自己的核心观点:服务器和虚拟机都不会消失,但我们与它们之间直接的互动将会越来越少. 私有云市场日渐式微,但千万不要怪OpenStack.因为从一开始,关于私有云的想法可能就错了. 如同AWS被认为是云端服务标准,VMware被认为是本地服务器虚拟化标准,而OpenStack则被一度誉为是VM

一名风险投资人总结的创业者们十大迷思

  我最近成了一名风险投资人,所以经常可以遇到一些创业者[1]在创业时常犯的错误.为了避免一遍又一遍的重复说教,我想把这些错误在这里做一个总结: 迷思一:一个好想法就可以让你赚大钱 事实是好想法对于商业成功既不是充分条件也不是必要条件.微软应该算是获得商业成功的典型,但是在它的整个发家史上却找不到一个完全独创的"好想法".事实上微软正式通过模仿对手的想法并在竞争中打败对手而一步步发展壮大的.Google确实有一些独创的,像Page Rank,Ad-words,廉价机器集群等.但是这些没

Web 2.0的迷思与真实

中介交易 SEO诊断淘宝客 站长团购 云主机 技术大厅 我连续好几个月,用不同的角度.层级及方法,说明了「小圈圈」这种在 Web 2.0 时代尤其需要被重视的人际关系.无独有偶,黄彦达最近在<数字之墙>中,也明白指出(人与人的)「关系」纔是 Web 2.0 的重点. 不过,在小圈圈.在人际关系之外,许多人口中的 Web 2.0 还充斥着各式各样的迷思,觉得 Web 2.0 就是如何如何,或者如何如何即能成就 Web 2.0:我在最近的一场公开演说中,恰好准备了一份「额外附赠」的讲题,谈论到 W

Google工具条PR更新与排名变化的迷思

这几天Google工具条PR又在更新了.我感觉更新还没结束,显示PR数据准确性很值得怀疑. 现在对Google PR更新本身越来越不感兴趣了.因为基本上没有大的造链接活动,PR值也不会有什么太大变化了.不过看到网上有一些关于PR更新及网页在Google中排名变化的一些迷思,觉得还是有必要把自己的一些理解跟大家介绍一下. Google工具条PR不是真实的PR 大家所看到的工具条上显示的绿色条,更准确的应该称为可见的工具条PR值,而不是Google内部用于排名计算的真实PR值. Google真正使用

互联网内容生产迷思

中介交易 SEO诊断 淘宝客 云主机 技术大厅 人类自诞生以来,就存在着各种各样的迷思,有的迷思自己就能够解答,过程被称之为求知.有的迷思需要别人的帮助,被称之为问道.这样的迷思大多数某个具体问题或者是问道者身处局外,最终也能够得到解答.最让人难以忍受的迷思是,自己身处这盘棋局之中.进而对于系统的迷思.要解答这样的迷思,就需要跳出去. 让我们试着跳出互联网之外,以一种较为超然的视角,审视一下互联网内容的是如何产生以及运行的. 营销驱动下的内容生产 80%乃至以上的互联网内容生产都是以营销作为驱动

转评译文:解开创业者们的十大迷思

前言:看到共鸣的文章我现在往往会转过来,然后加上一些说明跟注解,o(∩_∩)o...,自己文笔越来越差了,不过思考的心不分彼此吧,o(∩_∩)o...于是转之然后搞个加强版) 以下是正文: 我最近成了一名http://www.aliyun.com/zixun/aggregation/17479.html">风险投资人,所以经常可以遇到一些创业者[1]在创业时常犯的错误.为了避免一遍又一遍的重复说教,我想把这些错误在这里做一个总结: 迷思一:一个好想法就可以让你赚大钱 事实是好想法对于商业成

点评的突破(三):真实性的迷思

(文/谢震)我对互联网上的信息问题有个很粗浅的分类: &http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; 1.  信息的丰富性.从互联网诞生的那一天就基本解决了 2.  信息的对称性.各种web2.0的方式为此做出了巨大贡献 3.  信息的相关性.这是搜索引擎努力的主要方向 4.  信息的真实性.尚无整体的解决方案.SNS很大的价值在于它能部分地解决这一问题 点评类网站在解决信息相关性的问题上具有天然的优势.当访问大

贫民窟的迷思

据说,巴西里约热内卢的贫民窟是魔鬼见到也会叹息着转身的地方.在那里,恶徒肆意横行,警匪枪战时有发生,死亡如同家常便饭-或者警匪直接沆瀣一气,危害城市.正如2002年一部名为<上帝之城>的电影所展示的,在里约热内卢的贫民窟,生活有时候就像一场冒险. 近年来,里约热内卢当局的"安抚"让贫民窟里的犯罪不再像以前那么猖獗-部分靠2007年的电影<精英部队>里描述的刚正严明的治安力量,部分靠在贫民窟内兴建大量的基础设施. 不过,这只是跟贫民窟有关的问题的一部分而已.里约热