- 使用正则表达式描述模式
- 非确定有限状态自动机NFA
- 模拟NFA的运行
- NFA的表示
- 构造与正则表达式相对应的NFA
- NFA的模拟与可达性
除了查找子字符串,在很多时候并不知道被查找模式的完整信息,这时就需要用到正则表达式了。正则表达式在子字符串查找、合法性校验、网络爬虫等方面有着非常广泛的应用。
使用正则表达式描述模式
正则表达式对模式的描述,基于几个基本操作。
- 连接操作,比如AB,表示由A和B连接而成的模式。
- 或操作,或操作可以在模式中指定多种可能的匹配,用"|"表示。
- 闭包操作,闭包操作可以把模式部分重复任意次数,用"*"表示。
- 括号,括号可以改变默认优先级的顺序。
- 在编程语言中使用的正则表达式还有很多其它语法,但都是基于这几种基本操作的。
非确定有限状态自动机
如何根据正则表达式所描述的模式来匹配文本呢?子字符串查找中使用的有序状态自动机DFA会根据文本中的字符改变自身的状态,但正则表达式匹配比子字符串查找更复杂。因为或操作的存在,自动机无法仅根据一个字符就判断出模式是否出现;再加上闭包的存在,自动机甚至无法知道需要检查多少字符才会匹配失败。为了克服这些困难,需要非确定有限状态自动机NFA。
根据Kleene定理,任意正则表达式都存在一个与之对应的非确定有限状态自动机,反之亦然。所以任意正则表达式都可以转换为一个非确定有限状态自动机,然后就可以模式NFA的运行轨迹来进行匹配了。
正则表达式((A*B|AC)D)所对应的NFA如下图ÿ