一、写在前面

搞编程的都知道正则表达式是什么东西,这里就不多啰嗦了,需要强调的是,这篇文章并不是教你怎么去使用用正则表达式,正则表达式的语法并不是本文的重点,这篇文章的目的就是剥开正则表达式的语法糖,来看一看正则表达式最本质的原理,如果文章中有错误或者纰漏,欢迎批评指正。

二、什么是语法糖

在上面我提到了语法糖的概念,也许有人还不清楚语法糖是什么东西,这里简单的说一下。

语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。——摘自 百度百科

可以这么说吧,像C、C++、Java等等这些编程语言都可以看做成语法糖,因为最终还是得将这些高级程序语言翻译成机器代码,也就是10101……这样的形式,要知道所有的可执行程序最终都可以只需要赋值和跳转两种结构即可,而高级语言都是对这两种结构的封装,来适应不同的应用场景,除了机器代码,汇编和这些高级语言都是语法糖,一层一层的包装,达到简化开发的目的,大家想想,如果没有这些语法糖,那我们岂不是得天天用机器代码写程序?

三、算数表达式

这里先引入一个小小的例子,我想在阅读这篇文章的人都知道什么是算数表达式,最基本的算数表达式:

1,2,3,4,5,6,7,8,9,0,……

+,-,*,/,……

这些都是最基本的算数表达式,而由这些最基本的算数表达式可以构造出更加复杂的复合表达式比如1+1,3*5等等,无论是基本的还是复合的,它们都是算数表达式,通过这个例子,来自然的过渡到下面正则表达式的内容,其实本质上算数表达式和正则表达式的道理是差不多的。

四、正则表达式

构成正则表达式最基本的就是给定的字符集∑={c1,c2,c3,……,cn},这就相当于算数表达式中的0,1,2,3……这些基本算数表达式。

接下来呢,就是他的归纳定义,来告诉我们如何通过最基本的字符集构造出复杂的正则表达式:

空串ε是正则表达式。

对于任意字符c∈∑,c是正则表达式

如果M,N是正则表达式,则以下也是正则表达式:

**选择** M|N = {M,N}

**连接** MN = {mn | m∈M, n∈N}

**闭包** M* = {ε,M,MM,MMM,……}

不难看出,以上的归纳定义给出了正则表达式最基本的的形式,无论多么复杂的正则表达式都是在这个基础上构成的。

现在我们通过一个小例子来加深对上面概念的理解:

给定一个字符集∑={a,b},可以写出那些正则表达式呢?

1. ε

2. a,b

3. ε|ε,ε| a , ε| b ,……

4. εa , εb , ab , εε , ……

5. a(ε| a) , b(ε|b),……

6. ε* , (a(ε| a))*,……

7. ……

也就是说,单个的字符都是正则表达式,它们按照上面的定义组合起来依然是正则表达式,正则表达式与正则表达式相互组合又可以生成新的正则表达式,在复杂的正则表达式都是由这些基本的正则表达式构成,当然了上面这些只是该字符集的正则表达式的一小部分,因为这个字符集的正则表达式集合是一个无限集,到这里,我想大家应该有所体会。

我们再来看一个例子:

我们用上面的正则表达式的概念来构造出用来描述C语言标识符的正则表达式:

首先给定字符集,我们都知道C语言的字符集有ASCII码构成。

C语言标识符的格式:以字母或下划线开头,后面跟零个或多个字母、数字或下划线。

该怎么用正则表达式来描述呢?

(a|b|c|……|z|A|B|C|……|Z|_)(a|b|c|……|z|A|B|C|……|Z|0|1|2|3|……|9|_))*

首先来看,这个正则表达式是由两个子表达式连接而成,每个子表达式都是用选择符|构成,又因为第二个子表达式可以出现零或多次,所以加上闭包,是不是看的脑袋都大了,是不是觉得平时什么时候这么写过正则表达式,下面就得说说语法糖的作用啦。

五、正则表达式中的语法糖

大家接触到的正则表达式的语法似乎是有差异的,比如POSIX风格正则表达式和Perl风格正则表达式,要知道无论什么风格的正则表达式它们背后的原理都是一样的,只是在上层提供的语法糖不一样而已,实际应用的过程中都是根据上面的原理演变过来的,语法糖可以大大简化正则表达式的形式,变得更容易阅读和理解,就像下面的对应关系一样。

[c1-cn] == c1|c2|c3|……|cn

e? == ε|e

e+ == (e*)\ε

e{i,j} == i到j个e连接

这里就不一一举例了,无论上面的对应关系中左边的语法如何变化,它所对应的右边的基本原理都是一样的。

六、小结

正则表达式可以写的非常复杂,复杂到除了作者外很少有人看的懂的,曾经我也是一度不能自拔,但随着学习的深入,慢慢的发现,剥开正则表达式表面的东西,去看背后的原理,才有一种恍然大悟的感觉。

正则表达式发明者_浅谈正则表达式背后的基本原理相关推荐

  1. 《计算机辅助教学及应用实践研究》,《论文_浅谈计算机辅助教学(定稿)》

    <论文_浅谈计算机辅助教学(定稿)> (3页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 摘要:计算机辅助教学中要用到多媒体课件 ...

  2. python判断两个对象是否为相等使用的运算符是_Python入门_浅谈逻辑判断与运算符...

    这是关于Python的第6篇文章,主要介绍下逻辑判断与运算符. (一) 逻辑判断: 如果要实现一个复杂的功能程序,逻辑判断必不可少.逻辑判断的最基本标准:布尔类型. 布尔类型只有两个值:True和Fa ...

  3. python中文字符串编码_浅谈python下含中文字符串正则表达式的编码问题

    前言 Python文件默认的编码格式是ascii ,无法识别汉字,因为ascii码中没有中文. 所以py文件中要写中文字符时,一般在开头加 # -*- coding: utf-8 -*- 或者 #co ...

  4. 正则表达式发明者_正则表达式 – 简介

    正则表达式 - 简介 除非您以前使用过正则表达式,否则您可能不熟悉此术语.但是,毫无疑问,您已经使用过不涉及脚本的某些正则表达式概念. 例如,您很可能使用 ? 和 * 通配符来查找硬盘上的文件.通配符 ...

  5. 正则表达式发明者_【D1n910】正则表达式入门(三)

    正常操作,正常分析,大家好,我是D1n910. 最近又发生了一些很严重的事情,祥林嫂是可怜的,可是因为又祥林嫂的存在,让一些人可能不愿意向别人倾诉自己"悲惨"的经历了. 正则表达式 ...

  6. python文件路径拼接多出斜杠_浅谈python中拼接路径os.path.join斜杠的问题

    浅谈python中拼接路径os.path.join斜杠的问题 调试程序的过程中,发现通过os.path.join拼接的路径出现了反斜杠 directory1='/opt/apps/upgradePac ...

  7. 如何用python抓取文献_浅谈Python爬虫技术的网页数据抓取与分析

    浅谈 Python 爬虫技术的网页数据抓取与分析 吴永聪 [期刊名称] <计算机时代> [年 ( 卷 ), 期] 2019(000)008 [摘要] 近年来 , 随着互联网的发展 , 如何 ...

  8. android 换行乱_浅谈Android textview文字对齐换行的问题

    今天忽然发现android项目中的文字排版参差不齐的情况非常严重,不得不想办法解决一下. 经过研究之后,终于找到了textview自动换行导致混乱的原因了----半角字符与全角字符混乱所致!一般情况下 ...

  9. python sys模块作用_浅谈Python中的模块

    模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Mod ...

最新文章

  1. Datawhale组队学习:初级算法梳理课程任务
  2. rsync 断点续传
  3. Icarus Verilog与GTKWave简介及其下载安装
  4. 机器学习实战(十四)利用SVD简化数据
  5. C# 格式化字符串 String.Format
  6. Linux内核开发:内核模块参数
  7. Js实现文字水平滚动
  8. 为IoT应用搭建DevOps管道
  9. eslint+prettier+husky的配置说明
  10. VS出现error LNK2005,error C4430,error C2011
  11. java做游戏前端_小游戏——金庸奇侠传(JAVA,对面向对象的进一步了解)
  12. 深度卷积神经网络结构演变
  13. wine模拟器安装xshell
  14. python——金融商品多种均线指标综合运用模拟实现(MACD模型)
  15. 2019 力扣杯全国秋季编程大赛:3. 机器人大冒险(模拟)
  16. 饥荒独立服务器在线模式收不到,Windows 服务器搭建Don’t Starve Together饥荒独立服务器教程...
  17. 如何使用FFmpeg命令处理音视频
  18. 网络(Network)
  19. 基于QlExpress实现薪资计算
  20. win7重装的坑:启动分区不存在 使用分区工具修正

热门文章

  1. 什么为java运行时的环境_什么是JRE?Java运行时环境简介(一)
  2. java 标准输入流 关闭 打开_java输出流关流疑问,以下这个程序的in和out是否要关闭?...
  3. strictmath_Java StrictMath cos()方法与示例
  4. 芭比扣了!Nacos中服务删除不了,肿么办?
  5. 第 6-4 课:MyBatis 核心和面试题(上)
  6. Java 200+ 面试题补充③ Dubbo 模块
  7. windows自定义快速启动(运行)命令
  8. Nginx For Windows HTTP转发和负载
  9. java中_null和“”的区别详解
  10. C语言空指针NULL详解