《算法》笔记 16 - 正则表达式

  • 使用正则表达式描述模式
  • 非确定有限状态自动机NFA
  • 模拟NFA的运行
    • NFA的表示
    • 构造与正则表达式相对应的NFA
    • NFA的模拟与可达性

除了查找子字符串,在很多时候并不知道被查找模式的完整信息,这时就需要用到正则表达式了。正则表达式在子字符串查找、合法性校验、网络爬虫等方面有着非常广泛的应用。

使用正则表达式描述模式

正则表达式对模式的描述,基于几个基本操作。

  • 连接操作,比如AB,表示由A和B连接而成的模式。
  • 或操作,或操作可以在模式中指定多种可能的匹配,用"|"表示。
  • 闭包操作,闭包操作可以把模式部分重复任意次数,用"*"表示。
  • 括号,括号可以改变默认优先级的顺序。
  • 在编程语言中使用的正则表达式还有很多其它语法,但都是基于这几种基本操作的。

非确定有限状态自动机

如何根据正则表达式所描述的模式来匹配文本呢?子字符串查找中使用的有序状态自动机DFA会根据文本中的字符改变自身的状态,但正则表达式匹配比子字符串查找更复杂。因为或操作的存在,自动机无法仅根据一个字符就判断出模式是否出现;再加上闭包的存在,自动机甚至无法知道需要检查多少字符才会匹配失败。为了克服这些困难,需要非确定有限状态自动机NFA。

根据Kleene定理,任意正则表达式都存在一个与之对应的非确定有限状态自动机,反之亦然。所以任意正则表达式都可以转换为一个非确定有限状态自动机,然后就可以模式NFA的运行轨迹来进行匹配了。

正则表达式((A*B|AC)D)所对应的NFA如下图ÿ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值