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

简介:

自动机

自动机,顾名思义,就是能够自动完成事情的“机器”。但是为什么要用自动机,什么又叫“自动”呢?

我们看看普通的处理方式,简单的就是if了,例如:判断某字符串是否是“Hello,Word,我们都会这么写:

ifstr == “Hello,Word”

普通的比较可以满足大部分的场景,但对于正则表达式这种比较的话,普通的if就完全不能满足了,例如a*b|c,可以是如下字符串:

ab

aab

aaaab

c

………….

这种情况我们不可能采用普通的if来判断了,因为不可能穷举所有的字符串。所以我们要另辟蹊径,自动机就应运而生了。

我们这里讲的自动机有两个:一个是确定有限自动机,又叫DFA;一个叫不确定有限自动机,又叫NFA。由于自动机的核心就是通过“状态”和“状态变迁”实现的,所以自动机又叫状态机。

1) NFA

为什么叫不确定自动机呢?就是因为存在“不确定性”了。

什么不确定呢?就是一个输入可能对应多个状态转换,所以就不确定了。

通过NFA来识别字符串的过程很简单,即每输入一个字符,都判断当前的状态集中哪些状态上有此字符的转换,然后把所有转换后的状态又记录下来,依此循环,直到字符输入结束或者状态机结束。

不知道大家有没有发现,NFA的识别过程其实非常类似NFA转换到DFA的子集构造算法的过程。如下图:

NFA识别过程,假如识别aabb

1)初始状态:01247

2)输入a,转换到如右的状态:3, 6, 7, 1 , 2 ,4,

3)输入a,转换到如右的状态:8, 3, 6 , 7, 1, 2, 4

4)输入b,转换到如右的状态:9, 5, 6, 7, 1, 2, 4

5)输入b,转换到如右的状态:10, 5, 6, 7, 1, 2, 4

由于此时已经没有输入字符了,而且最终状态10也包含进来了,因此aabb就接受了。

 

NFA->DFA的子集构造算法:

1)初始状态:01247(第一个子集)

2)输入a,转换到如右的状态:3, 6, 7, 1 , 2 ,4(第二个子集)

3)输入a,转换到如右的状态:8, 3, 6 , 7, 1, 2, 4(第三个子集)

………………………..(依次类推)…………………………………………..

 

 

2) DFA.

介绍到这里,相信大家都已经明白DFA的概念了。

所谓确定,就是指一个输入只能对应一个转换。

DFA来识别字符串就更简单了,由于转换是确定的,所以直接将输入字符输入进行转换即可。

 

3) NFADFA比较.

复杂度:当然是DFA高了;

速度:当然是DFA快了

 

到这里正则表达式系列相关知识也就结束了,当然我在这里知识提纲挈领,让大家能够从整体上把握这些相关的东东,不至于上来就被一堆术语和名词弄晕了,同时也把关键的地方点了一下,希望能够起到让大家茅塞顿开的效果。

当然更加详细和深入的研究还需要各位自己深入钻研了,推荐《编译原理(龙书)》和《精通正则表达式》两本书。

 

相关文章
|
6月前
|
机器学习/深度学习 前端开发 Windows
【夯实技术基本功】「底层技术原理体系」全方位带你认识和透彻领悟正则表达式(Regular Expression)的开发手册(正则符号深入解析 )
【夯实技术基本功】「底层技术原理体系」全方位带你认识和透彻领悟正则表达式(Regular Expression)的开发手册(正则符号深入解析 )
74 0
|
6月前
|
XML JSON 监控
Java语言中的正则表达式技术详解
Java语言中的正则表达式技术详解
|
5月前
|
机器学习/深度学习 Unix Java
程序技术好文:正则表达式详解
程序技术好文:正则表达式详解
72 0
|
5月前
|
开发框架 安全 JavaScript
技术心得记录:收集一些常用的正则表达式
技术心得记录:收集一些常用的正则表达式
|
5月前
|
机器学习/深度学习 JavaScript 前端开发
技术心得记录:正则表达式(c#)
技术心得记录:正则表达式(c#)
25 0
|
6月前
|
存储 机器学习/深度学习 缓存
【夯实技术基本功】「底层技术原理体系」全方位带你认识和透彻领悟正则表达式(Regular Expression)的开发手册(正则表达式定义 )
【夯实技术基本功】「底层技术原理体系」全方位带你认识和透彻领悟正则表达式(Regular Expression)的开发手册(正则表达式定义 )
47 0
|
Python
Python实用技术一:正则表达式
用以表示“此处必须出现一个某某范围内的字符”,或者“此处必须出现一一个字符,但不可以是某某范围内的字符” ,但不可以十某某范围内的字符。
114 0
Python实用技术一:正则表达式
|
数据采集 自然语言处理 JavaScript
通用技术 | 正则表达式
正则表达式是一种通用的技术,它不仅适用于开发人员,对于非开发人员来说,掌握这项技术同样可以提高日常的工作效率。它的覆盖范围之广泛,可以用"无所不至"形容,linux命令行、文本搜索、开发、爬虫等。本文就来详细介绍一下正则表达式的使用。
通用技术 | 正则表达式
|
JavaScript 前端开发
JavaScript 技术篇-js正则表达式匹配中英文数字
JavaScript 技术篇-js正则表达式匹配中英文数字
494 0
JavaScript 技术篇-js正则表达式匹配中英文数字
|
JavaScript 前端开发
JavaScript 技术篇-js正则表达式匹配字符串左右两边是否包含空格
JavaScript 技术篇-js正则表达式匹配字符串左右两边是否包含空格
604 0
JavaScript 技术篇-js正则表达式匹配字符串左右两边是否包含空格