看一下内部引擎如何工作

知道正则表达式引擎如果工作可以让你很容易的构造出更好的正则表达式。这会帮助你理解为什么有的正则表达式并不如你预期的那样工作,这会帮你省下很多时间。

有2种正则表达式引擎,文本导向引擎和正则导向引擎。Jeffrey Friedl将他们称作DFA和NFA引擎(确定的有穷自动机和不确定的有穷自动机)。本文中谈到的正则引擎都是正则导向引擎。这是由于很多有用的特征,比如惰性和反向引用只能在正在导向引擎中实现,因此这种引擎的流行也不足为怪。

比较著名的使用文本导向引擎的工具有awk, egrep, flex, lex, MySQL和Procmail,awk和egrep,也有些版本使用的是正在导向引擎。

你可以很容易的知道所使用的正则表达式采用的是文本导向引擎还是正则导向引擎。如果可以使用反向引用或者惰性特性可以使用,那么可以确定采用的是正则导向引擎。你可以通过正则表达式regex|regex not测试字符串regex not来判断,如果匹配的是regex那么是正则导向的,如果匹配的是regex not,那么是文本导向的,这是因为正则引擎是“急切的”。

本文中在介绍一些新的正则符号后,将会逐步的解释正则引擎如何处理这些符号。某些时刻,探讨内部原理可能是比较啰嗦,但是理解正则引擎的工作原理会是非常有用的。

正则导向引擎:返回最左的匹配项

这个是重点,正则导向引擎总是返回最左的匹配项,即使在之后能发现一个更好的匹配项。当对一个字符串使用正则匹配的时候,引擎从字符串的第一个字符开始。它从第一个字符就尝试正则表达式所有的可能的排列。只有当所有的可能性都尝试了并且都失败了,正则引擎才继续匹配文本中的第二个字符。同样的,它尝试正则表达式所有可能的排列,以同样的命令。结果就是正则表达式返回了最左匹配项。

当用cat匹配He captured a catfish for his cat.,先试着拿正则表达式中的第一个字符c去匹配H。失败。此时正则表达式没有别的组合,因为它就包含了一组文本字符。所有正在引擎试着用c去匹配e,也失败了,就和c去匹配空格一样。到第4个字符的匹配。c匹配到了c,这是引擎继续试着用第2个符号a去匹配第5个字符,也成功。但是,接下来的t失败了。就在此时,引擎知道正则表达式从第4个字符开始不匹配,所一它继续从第5个字符a开始匹配。c匹配依旧失败,引擎继续前进。在第15个字符匹配了。c再次匹配了c。引擎继续试着匹配正则表达式中的剩余字符,并且发现a匹配a,t匹配t。

整个正则表达式可以从第15个字符处匹配。这个引擎非常“渴求的”输出这个匹配。因此,它会输出catfish中的前3个字母作为有效的匹配。引擎不会从继续下去了,不再尝试是否有更好的匹配,首个匹配它认为是足够好了。

第一个例子中,正则表达式引擎看上去似乎和正则文本查询程序类似。文本导向引擎也能返回相同的结果。但是在你的脑海中能有引擎执行的步骤也是非常重要,第二个例子中,引擎工作的方式对匹配有着深远的影响。某些结果可能会让人奇怪。但是一旦你知道引擎怎么工作,它总是按照逻辑并且是注定的。

本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/710592,如需转载请自行联系原作者

正则表达式入门教程-连载(2)-正则表达式引擎怎么工作的相关推荐

  1. 正则表达式入门教程经典Javascript正则表达式(share)

    前言 例子: ^.+@.+\\..+$ 这样的代码曾经多次把我自己给吓退过.可能很多人也是被这样的代码给吓跑的吧.继续阅读本文将让你也可以自由应用这样的代码. 正文 教程:正则表达式30分钟入门教程 ...

  2. 正则表达式入门教程-连载(4)-点符号(.)

    点符号(.)匹配几乎任何字符 在正则表达式中,点符号.是最常用的元字符,也是最被滥用的元字符. 点符号.匹配单个字符,不管是什么字符,为一的例外就是换行符.本教程中所涉及到的正则表达式,点符号.默认情 ...

  3. Node.js 入门教程 6 V8 JavaScript 引擎

    Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录 Node.js 入门教程 6 V8 JavaScript 引擎 6 ...

  4. 正则表达式30分钟入门教程、常用正则表达式

    From:http://deerchao.net/tutorials/regex/regex.htm 正则表达式语言 - 快速参考:https://docs.microsoft.com/en-us/d ...

  5. 推荐 正则表达式入门教程

    看到编写比较好而且学习时间比较短的教程,很不错哦.推荐给大家学习. 正则表达式30分钟入门教程 转载于:https://blog.51cto.com/bearstudyhard/299713

  6. python正则表达式入门_Python中的正则表达式教程

    本文http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html 正则表达式经常被用到,而自己总是记不全,转载一份完整的以备不时之需. 1. ...

  7. 绿色版的正则表达式测试工具及正则表达式入门教程

    下载网址:https://download.csdn.net/download/xyz846/10856604 RegexTester是一款正则表达式测试器,支持单行模式.多行模式,经典的窗口设计,该 ...

  8. 超简单正则表达式入门教程

    你好呀,我是阿德. 正则表达式是在程序或命令行中查找和替换文本的强大工具.熟悉最常见的正则表达式符号,以及如何使用它们,对于程序员来说是必不可少的技能. 正则表达式是在搜索中需要匹配的特殊字符串,使用 ...

  9. zybo的linux开发教程,Zybo全栈开发入门教程——连载三:创建Linux设备驱动和应用程序...

    作者:Commanderfranz,编译: kenshin 通过前面两篇文章我们不仅创建的自定义IP模块还移植了Linux操作系统,今天这篇文章的内容是将这两部分联系起来,其实我们创建的myLed I ...

最新文章

  1. Java实用教程笔记 子类与继承
  2. 借助 Evolution Linux 的帮助来轻松安装 Arch Linux
  3. parzen窗估计如何进行结果分析_实现一下模式识别(一)Parzen窗估计
  4. Linux shell去除字符串中所有空格
  5. linux搭建SonarQube_Oracle
  6. Android 调用系统相机拍照,生命周期重走OnCreate,导致无数据的解决办法
  7. easyui下拉框和增加以及商品的上架和下架
  8. IaaS/PaaS平台搭建
  9. ee er_61对词根相同后缀分别是er和ee的单词要这样区别记忆它们
  10. 五色电阻在线计算机,五色环电阻阻值在线计算一键生成计算器
  11. 2020.10-2021.01前端开发部分总结
  12. stay foolish, stay hungry
  13. 用计算机数字唱歌,悬赏跪求计算器各种歌曲数字谱(最好带和音)
  14. 抖音创意拍摄玩法让你轻松上热门,抖音分身特效教程。
  15. python基础(一)
  16. 远程桌面链接怎么用(win10电脑远程桌面连接工具怎么使用)
  17. Linux 常用命令 — 修改密码
  18. Linux c使用gumbo库解析页面表单信息(二)
  19. linux arecord录音
  20. 【Arduino基础】蜂鸣器发声实验

热门文章

  1. 世界杯来了!小程序赛事操作来一波~
  2. xfire冲突问题解决(maven配置)
  3. 标记区域 Region
  4. storage theory
  5. 在iphone上安装多个微信 【微信营销必备】
  6. asp:Button 事件,点击事件 html Button runat=sever
  7. Lcs客户端配置和测试
  8. 请求重定向与请求转发的比较(HttpServletResponse.sendRedirect方法和RequestDispatcher.forward方法)...
  9. jQuery.i18n.properties实现js国际化
  10. docker安装执行问题