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

一、写在前面

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

二、什么是语法糖

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

语法糖(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连接

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

六、小结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555622.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java8 - 使用 Comparator.comparing 进行排序

使用外部比较器Comparator进行排序 当我们需要对集合的元素进行排序的时候,可以使用java.util.Comparator 创建一个比较器来进行排序。Comparator接口同样也是一个函数式接口,我们可以把使用lambda表达式。如下示例, package com.common;im…

cairo填充_Cairo 图形指南 (5) —— 形状与填充

这一部分,讲述一些基本的以及较为高级的形状绘制及其纯色 (solid color)、图案 (pattern) 与渐变 (gradient) 填充方法。基本形状Cairo 提供了几个用于绘制基本形状的函数。#include#include#includestatic gbooleanon_expose_event (GtkWidget * widget,GdkEventEx…

java集合进行排序的两种方式

java集合的工具类Collections中提供了两种排序的方法,分别是: Collections.sort(List list)Collections.sort(List list,Comparator c) 第一种称为自然排序,参与排序的对象需实现comparable接口,重写其compareTo()方法,方法体中实现对象的比较大小规则,示例如下: 实体类:(基本…

ubuntu编写python脚本_python在ubuntu中的几种方法(小结)

通过ubuntu官方的apt工具包安装通过PPA(Personal Package Archive) 的apt工具包安装通过编译python源代码安装通过ubuntu官方的apt工具包安装安装完成后, 可以用下面的命令进行确认从PPA(Personal Package Archives) 安装apt工具包类似使用apt工具包安装python的工…

Java中String类中compareTo( )方法

compareTo方法是比较简单的,我们可以直接看其源码: 源码如下: public int compareTo(String anotherString) {int len1 value.length;int len2 anotherString.value.length;int lim Math.min(len1, len2);char v1[] value;char v2[] anotherString…

python elif可以单独使用_Python的elif语句怎么用

else和elif语句也可以叫做子句,因为它们不能独立使用,两者都是出现在if、for、while语句内部的。else子句可以增加一种选择;而elif子句则是需要检查更多条件时会被使用,与if和else一同使用,elif是else if 的简写。if和…

SpringMVC接收哪些类型参数参数

支持的数据类型: 基本类型参数: 包括基本类型和 String 类型 POJO 类型参数: 包括实体类,以及关联的实体类 数组和集合类型参数: 包括 List 结构和 Map 结构的集合(包括数组) SpringMVC …

禁用当前的账户win7_系统小技巧:服务客人 开启Windows 10来宾账户

出于安全考虑,Windows 10默认以管理员账户登录,没有开启来宾账户。但对于那些只需在电脑上浏览网页或收看电子邮件的用户,给他们开启来宾账户非常必要。来宾权限或账户的开启,可以通过下面的两种方法。1. 通过系统设置 开启来宾权…

Java之接口的静态方法的定义和使用

格式如下:(就是将abstract或者default换成ststic即可,带上方法体) public static 返回值类型 方法名称(参数列表){方法体----}代码如下: //定义一个接口 public interface MyInterfaceStatic …

三阶魔方还原步骤图_三阶魔方公式图解、教程

三阶魔方公式、魔方图解、魔方教程,从零基础到精通!魔方还原法 Rubics Cube Solution ————先看理论“魔方的还原方法很多精彩内容,尽在百度攻略:https://gl.baidu.com在这里向大家介绍一种比较简单的魔方六面还原方法。这种方…

通俗易懂告诉你CPU/GPU是什么?

通俗易懂告诉你CPU/GPU是什么? CPU CPU( Central Processing Unit, 中央处理器)就是机器的“大脑”,也是布局谋略、发号施令、控制行动的“总司令官”。 CPU的结构主要包括运算器(ALU, Arithmetic and Logic Unit)、控制单元&a…

mysql正在加载_mysql 数据库基本操作

CREATE TABLE classes(id INT PRIMARY KEY AUTO_INCREMENT COMMENT班级表id,name VARCHAR(20) COMMENT班级名称);运行DESCRIBE classes;--------------------------------------------------------| Field | Type | Null | Key | Default | Extra |---------------------------…

CPU和GPU的区别是什么?

CPU是一种微处理器,用于执行程序根据操作(如算术、逻辑、控制和输入-输出)给出的指令。相反,GPU最初设计用于在电脑游戏中渲染图像。CPU强调低延迟,而GPU则强调高吞吐量。 CPU Vs GPU 内容 比较表格定义区别关键不同结论 1. 比较表格 从上…

乌班图配置mysql Java_Ubuntu准备+MySQL+Java

Linux服务器准备1 . 安装Ubuntu系统2 . 修改root用户密码sudo passwd root #修改root账户密码logout # 退出当前账号并重新登录#如果需要关机使用 halt 命令3 . 更新所有Linux的开发包apt-get update4 . 配置相关的编译包apt-get install gcc libpcre3 libpcrecpp* libpcre3-de…

java截取指定字符串中的某段字符

利用字符串的substring函数来进行截取。 其中,substring函数有两个参数: 1、第一个参数是开始截取的字符位置。(从0开始) 2、第二个参数是结束字符的位置1。(从0开始) indexof函数的作用是查找该字符串中…

JSON中的JSON.parseArray()、JSON.parseObject()、JSON.tojsonString()

1、JSON.parseObject和JSON.toJSONString JSON.parseObject,是将Json字符串转化为相应的对象;JSON.toJSONString则是将对象转化为Json字符串。在前后台的传输过程中,JSON字符串是相当常用的,这里就不多介绍其功能了,直…

mysql是gplv3,Affero-GPL和GPLv3之间的区别

解决方案Assume the following:You are developing a server side application in GPL. Now this application serves HTML and not an executable which is directly executed on your machine. That means that another guy could take the GPL code, adapt it and does not …

mysql cluster proxy_GitHub - freedaxin/maya: a mysql cluster proxy powered by node.js

maya安装node.js依赖node v0.8最新版,暂不支持更高的node版本,此处以0.8.7版本为例。root安装(官方要求python2.5.2以上)tar -zxf node-v0.8.7.tar.gzcd node-v0.8.7./configure --prefix/usr/local/sinasrv2/makemake install在root环境变量中增加如下两…

常见HTTP状态码(200、301、302、500等)解说

对网站管理工作者来说有个词不陌生,HTTP状态码,它是用以表示网页服务器HTTP响应状态的3位数字代码。状态码的第一个数字代表了响应的五种状态之一。 1XX系列:指定客户端应相应的某些动作,代表请求已被接受,需要继续处…

linux c语言编写聊天室mysql_Linux平台上用C语言实现与MySQL数据库的连接

测试代码如下://查询操作#include #include #include #define HOST "localhost"#define USERNAME "用户名"#define PASSWORD "密码"#define DATABASE "PublicResourcesDB"int main(void){MYSQL mysql;MYSQL_ROW row;MYSQL_…