技海无涯:正则表达式相关的知识和技术(1)——表达式

正则表达式,看似简单,实则博大精深。简简单单几个字符:|、*、(、)……却能够演绎出无穷无尽的变化。初看正则表达式,其实就是一串子字符串,但隐藏在这字符串背后的各种各样的知识、技能、技巧,却一点也不简单。

以前在学习《编译原理(龙书)》的时候,也是一目十行的将其跳过,这次偶尔需要用到正则表达式,然后自己就上网搜了搜,结果发现水不是一般的深,耗费了3个晚上的时间搜索、查阅,才稍微理清了这些相关知识的关系和脉络,于是稍作整理归纳,既为了加深自己的理解,也为了共享给各位。

在正式开始之前,先将相关东东列出来,看看你能够知道几个?

NFA、逆波兰表达式、双栈、自动机、子集算法、中缀表达式、Thompson算法。

 

技海无涯:正则表达式相关的知识和技术

看到下面这一堆东东,你是不是觉得头皮发麻,思维混乱呢?

NFA、逆波兰表达式、双栈、自动机、子集算法、中缀表达式、Thompson算法……

按照这种散乱无章的顺序来理解和记忆,当然是感觉很混乱了。 其实事情没有那么复杂,要想理解起来容易,记忆也牢固,我们要抓住一条思维的线路,然后将这一堆的东东沿着思维的线路进行分门别类,下面就是我总结出来的正则表达式的思路:

表达式->转换算法->编程技巧->自动机。

首先正则表达式是一个表达式,但这个表达式最终是要让计算机理解和应用,这个理解和应用就是自动机。从表达式到自动机需要经过转换算法,在实现转换算法的时候有一些编程技巧,这样就把正则表达式从表达式到自动机串起来了。

下面我们一一介绍,这里只介绍简单的概念和知识点以及关联关系,详细的研究还需要各位自己上网查了。

 

表达式

表达式有几个相关的概念:前缀表达式、中缀表达式、后缀表达式、波兰表达式、逆波兰表达式。

概念介绍

前缀、中缀、后缀表达式很好理解,就是操作符在操作数前面、中间、后面,对应的英文分别是prefix notation, infix notation, postfix notation,英文好的大侠可以到google上直接搜索英文,有很多详细的介绍(如果要看详细的介绍和分析,一定要看英文),这里就不详细介绍了。

l         前缀表达式prefix notation:操作符在操作数前面,例如3+4转化成前缀表达式就是+34;

l         中缀表达式infix notation:操作符在操作数中间,例如3+4转化成中缀表达式就是3+4;

l         后缀表达式postfix notation:操作符在操作数后面,例如3+4转化成后缀表达式就是34+;

 

表达式对比

三种表达式各自的特点和作用是什么呢?其实说白了就是谁理解更容易的问题:

前缀表达式:不好意思,我还没有弄懂前缀表达式的作用,据说是在Lisp语言中用到,有可能是Lisp这种语言更好理解前缀表达式。

中缀表达式:人更好理解,从小到大四则运算我们都是这么用的,大家写正则表达式也是这么写的;

后缀表达式:计算机更好理解,没有括号,没有优先级,按照顺序计算即可。

正则表达式的书写、四则运算的书写,都是按照中缀表达式来写的,但实际在计算机处理的时候,是需要转换成后缀表达式来进行处理(当然也可以不完全转换成后缀表达式后再进行计算,可以边分析边计算,后面在讲编程技巧的时候会详细分析)。

 

波兰、逆波兰

介绍到这里,似乎表达式的格式都涵盖了,总不可能来个“上缀”或者“下缀”表达式吧?既然这样的话,相信你一定会有这样的疑问:

1)什么叫波兰表达式?什么叫逆波兰表达式?

2)和波兰有什么关系么?

其实答案很简单,波兰表达式就是前缀表达式,逆波兰表达式就是后缀表达式。至于为什么和波兰扯上关系,其实也很简单,就是因为波兰表达式是波兰的逻辑学家Jan Łukasiewicz发明的,就像大家熟悉的Microsoft的“匈牙利命名法”,其实就是一个匈牙利工程师提出来的一样。

 

至于为什么没有“中波兰”表达式,这个还没有研究,也许哪位大侠申请一下,从此可以多一个“中国表达式”:)

 

 

参考资料

http://en.wikipedia.org/wiki/Reverse_Polish_notation

http://en.wikipedia.org/wiki/Prefix_notation

 

 

========================未完待续==================================

 

时间: 2024-09-17 04:41:13

技海无涯:正则表达式相关的知识和技术(1)——表达式的相关文章

技海无涯:正则表达式相关的知识和技术(4)——自动机(完结篇)

自动机 自动机,顾名思义,就是能够自动完成事情的"机器".但是为什么要用自动机,什么又叫"自动"呢? 我们看看普通的处理方式,简单的就是if了,例如:判断某字符串是否是"Hello,Word",我们都会这么写: if(str == "Hello,Word") 普通的比较可以满足大部分的场景,但对于正则表达式这种比较的话,普通的if就完全不能满足了,例如a*b|c,可以是如下字符串: ab aab aaaab c ----. 这

技海无涯:正则表达式相关的知识和技术(3)——编程技巧:堆栈的本质探讨

编程技巧--堆栈的本质探讨 如果我要说本章的编程技巧就是为了介绍堆栈的使用技巧,你可能会笑掉大牙:哈哈,堆栈,这不是小儿科吗?!! 是的,每个编程的人都知道的堆栈,而且说起堆栈,大家肯定会马上想到"后进先出(LIFO)",这是教科书关于堆栈本质的解释. 没错,堆栈的本质是LIFO,但绝不是简单的先进后出就完了,结合各种各样的压栈出栈操作,堆栈可以实现很强大的功能.下面就以正则表达式涉及的两个例子来说明堆栈的妙用. 1) 通过堆栈来完成正则表达式->NFA. 在介绍表达式的时候提到

技海无涯:正则表达式相关的知识和技术(2)——算法

    转换算法 为了让正则表达式最终能够被机器识别,并且能够用其来匹配目标字符串,必须首先将正则表达式转换为NFA或者DFA(后面介绍)两种等价的自动机,一般的转换过程如下: 正则表达式-①->NFA-②->DFA. 当然也可以直接这样转换,当然这个算法复杂度更高: 正则表达式-③->DFA. 上面的每个过程对应一个算法,下面我们分别简单的介绍三种算法.   ①正则表达式-->NFA:Thompson 算法 算法本身是比较简单的,算法的关键如下:每个字符都构造一个NFA,然后用e

Java正则表达式基础入门知识_正则表达式

众所周知,在程序开发中,难免会遇到需要匹配.查找.替换.判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力.因此,学习及使用正则表达式,便成了解决这一矛盾的主要手段. 大家都知道,正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配. 一:什么是正则表达式

接触C#的服务器端正则表达式相关验证

初次接触C#的服务器端正则表达式相关验证 后续将会在这个基础上 将这个C#的服务器端正则表达式相关内容 集结在这里 入门示例如下 //验证 string strFileName = "S_123456_200701.zip" System.Text.RegularExpressions.Regex strReg = new System.Text.RegularExpressions.Regex(@"^S_\d{6}_\d{6}\.zip$"); if (strRe

网络-请问谁知道 Van Jacobson TCP/IP包头压缩 相关的知识和具体报文格式?

问题描述 请问谁知道 Van Jacobson TCP/IP包头压缩 相关的知识和具体报文格式? 新人一个,没有什么分:Van Jacobson TCP/IP包头压缩降低了TCP/IP包头的大小到接近3个字节,这对于慢速的串行线路来说是一大提高.IP压缩协议配置选项用于指示接收压缩包的能力.如果需要两个方向都进行压缩则需要双方独立申请. 4.1.PPP协议域值 在传送IP包时PPP协议域被设置为以下值: 0021 类型IP.IP协议不是TCP,或包是一个数据段,或未经过压缩. 002d 压缩的T

javascript正则表达式的基本知识

javascript正则表达式的基本知识 1     javascript 正则对象创建 和用法     声明javascript 正则表达式          var reCat = new RegExp("cat");       你也可以      var reCat = /cat/;      //Perl 风格   (推荐) 2 学习最常用的 test exec match search  replace  split 6个方法    1) test  检查指定的字符串是否存

每个人在自己看病的经历中都能收获到很多相关的知识和经验

所谓"久病成良医",每个人在自己看病的经历中都能收获到很多相关的知识和经验,把这些经验搬到线上来,打造一个病患交流社区,则正是厦门初创公司"病患如我"正在做的事. "病患如我"是一个UGC病患交流社区.同时还具备数据挖掘能力,会收集整理论坛中患者贡献的,与疾病诊疗相关的数据. 在"病患如我"每一个对应疾病的分区里,用户讨论的药品种类.医院类别等数据会被进行统计,并整理成为统计图.而数据获取的方式主要有三个,一是患者在注册的时候

正则表达式的基本知识_正则表达式

正则表达式的基本知识: 元字符: 正则表达式的威力在于其能够在模式中包含选择和循环.它们通过使用 有两组不同的元字符:一种是模式中除了方括号内都能被识别的,还有一种是在方括号内被识别的.方括号之外的元字符有这些:  有数种用途的通用转义符  断言目标的开头(或在多行模式下行的开头,即紧随一换行符之后)  断言目标的结尾(或在多行模式下行的结尾,即紧随一换行符之前)  匹配除了换行符外的任意一个字符(默认情况下)  字符类定义开始  字符类定义结束  开始一个多选一的分支  子模式开始  子模式结