技海无涯:正则表达式相关的知识和技术(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快了

 

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

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

 

相关文章
|
2月前
|
机器学习/深度学习 前端开发 Windows
【夯实技术基本功】「底层技术原理体系」全方位带你认识和透彻领悟正则表达式(Regular Expression)的开发手册(正则符号深入解析 )
【夯实技术基本功】「底层技术原理体系」全方位带你认识和透彻领悟正则表达式(Regular Expression)的开发手册(正则符号深入解析 )
32 0
|
Python
Python实用技术一:正则表达式
用以表示“此处必须出现一个某某范围内的字符”,或者“此处必须出现一一个字符,但不可以是某某范围内的字符” ,但不可以十某某范围内的字符。
94 0
Python实用技术一:正则表达式
|
数据采集 自然语言处理 JavaScript
通用技术 | 正则表达式
正则表达式是一种通用的技术,它不仅适用于开发人员,对于非开发人员来说,掌握这项技术同样可以提高日常的工作效率。它的覆盖范围之广泛,可以用"无所不至"形容,linux命令行、文本搜索、开发、爬虫等。本文就来详细介绍一下正则表达式的使用。
通用技术 | 正则表达式
|
JavaScript 前端开发
JavaScript 技术篇-js正则表达式匹配中英文数字
JavaScript 技术篇-js正则表达式匹配中英文数字
439 0
JavaScript 技术篇-js正则表达式匹配中英文数字
|
JavaScript 前端开发
JavaScript 技术篇-js正则表达式匹配字符串左右两边是否包含空格
JavaScript 技术篇-js正则表达式匹配字符串左右两边是否包含空格
552 0
JavaScript 技术篇-js正则表达式匹配字符串左右两边是否包含空格
|
测试技术 C#
一起谈.NET技术,浅谈提升C#正则表达式效率
  说到C#的Regex,谈到最多的应该就是RegexOptions.Compiled这个东西,传说中在匹配速度方面,RegexOptions.Compiled是可以提升匹配速度的,但在启动速度上,使用了RegexOptions.Compiled情况下,通常会使启动速度慢许多,据说最多是60倍。
1413 0
一起谈.NET技术,.NET 中的正则表达式
前两天面试一个程序员,自己说工作中用到过正则表达式,也比较熟悉,问他要使用正则表达式需要引用那个命名空间,使用哪些类,居然吱吱唔唔答不上来,让他写一个验证电话号码的正则表达式也写不出来,实在是很奇怪这种程序员是怎么工作了两三年的。
745 0
|
机器学习/深度学习 Windows
正则表达式实现资料验证的技术总结
资料验证无论在C/S还是在B/S中的使用都是非常普遍的, 过去大家喜欢用一堆的 IF...else...判断输入的内容是否满足要求. 如今很多语言都支持正则表达式, 它定义了一套自己的语法规则 (常见语法包括;字符匹配、重复匹配、字符定位、转义匹配和其他高级语法)来完成各种资料的验证, 功能之强大在我看来几乎到了无敌的地步.
725 0