本节第一部分主要介绍正则引擎的分类,由于java属于NFA,所以只重点介绍此类。其余类型简要或不做介绍。

分类的内容全部来自《精通正则表达式》v3

引擎类型

程序

DFA

awk(大多数版本)、egrep(大多数版本)、flex、lex、MySQL、Procmail

传统NFA

GNU Emacs、Java、grep(大多数版本)、less、more、.NET语言、PCRE library、Perl、PHP(所有三套正则库)、Python、Ruby、sed(大多数版本)、vi

POSIX NFA

mawk、Mortice Kern Systems'utilities、GNU Emacs(明确指定时使用)

DFA/NFA混合

GNU awk、GNU grep/egrep、Tcl

NFA(非确定型有穷自动机):表达式主导

正则:“to(nite|knight|night)”

目标文本:“tonight”

正则表达式从“t”开始,每次检查一部分(由引擎查看表达式的一部分),同时检查当前文本是否匹配表达式的当前部分。如果是,则继续表达式的下一部分,直到表达式的所有部分都能匹配。

此例中第一个元素是“t”,它会重复尝试,在目标字符串中找到“t”为止,然后检查“o”,过程与此一致。然后是“(nite|knight|night)”部分,表达式会一次尝试,直到宣告匹配成功或失败才会停止。 表达式中的控制权在不同元素之间转换,所以作者称其为“表达式主导”

所以正则:“nfa|nfa not”,目标字符串:“nfa not”中,也只是匹配“nfa”而已,而不会完整的匹配。

DFA (确定型有穷自动机) :文本主导

DFA引擎在扫描字符串时,会记录“当前有效”的所有匹配可能。

还是最初的例子,引擎移动到“t”时,它会在当前处理匹配可能中添加一个潜在的可能

接下来扫描的每个字符,都会更新当前的可能匹配序列。继续扫描两个字符之后的情况如上图。分支“knight”被排除。

书中作者称其问文本主导,是因为扫描每个字符的时候都对引擎进行了控制

测试引擎类型

1.如果支持忽略优先量词,那么基本就是传统NFA。DFA不支持忽略优先量词,POSIX NFA中也没有意义。

2.DFA不支持捕获型括号和回溯。在这两种混合类型的引擎中,如果没有使用捕获型括号,就会使用DFA

ps:在RegexBuddy中似乎只有传统NFA,起码做1的验证时结果是这样的,所以DFA和混合型引擎在这就不做验证了,本文也主要针对java,所以这里指着重介绍和java相关内容

两条普适原则(来自 《精通正则表达式》 v3) :

1.优先匹配最左面(最靠开头)的匹配结果

注意:此原则并没有规定优先匹配结果的长度,而只是规定在所有可能的匹配结果中,优先选择最左边的(可能有)。

作者关于此原则的解释:匹配先从需要查找的字符串的起始位置尝试匹配。这里的“尝试匹配”的意思是:在当前位置测试整个正则表达式能匹配的每个可 能。如果在当前位置测试了所有的可能之后找不到匹配结果,就需要从字符的第二个字符之前的位置开始重新尝试……只有在尝试过所有的起始位置(直到字符串的 最后一个字符)都找不到匹配结果的情况下,才会报告失败。

下面给出一个例子:

目标字符串“This is a cat.”

我想匹配字符“is”,我的正则为“is”

转载于:https://blog.51cto.com/ajiao13/1138480

深入入门正则表达式(java) - 匹配原理 - 1 - 引擎分类与普适原则相关推荐

  1. [Regular] 4、正则表达式的匹配原理原则

    原则一:优先选择最左端(最靠开头)的匹配结果 根据这条规则,起始位置最靠左端的匹配结果总是优先于其他可能的匹配结果.这里没有规定优先匹配结果的长度,而只是规定,在所有可能的匹配结果中,优先选择开始位置 ...

  2. 深入入门正则表达式(java) - 1 - 入门基础

    深入入门正则表达式(java) - 引言 深入入门正则表达式(java) - 1 - 入门基础  深入入门正则表达式(java) - 2 - 基本实例 深入入门正则表达式(java) - 3 - 正则 ...

  3. 正则表达式(三)—— 正则的匹配原理

    正则的匹配原理 正则引擎的分类 正则引擎主要可以分为三类:DFA.传统NFA(Traditional NFA)和POSIX NFA. 用了这么久的正则,js属于哪一种呢? 测试引擎的类型 是否是传统型 ...

  4. 正则表达式之 NFA 引擎匹配原理详解

    文章目录 一.为什么要了解引擎匹配原理 二.正则表达式引擎 三.预备知识 (一)字符串组成 (二)占有字符和零宽度 (三)控制权和传动 四.正则表达式简单匹本过程 (一)基础匹配过程 (二)含有匹配优 ...

  5. 正则基础之 NFA引擎匹配原理

    来源:http://www.jb51.net/article/19332.htm 1 为什么要了解引擎匹配原理 一个个音符杂乱无章的组合在一起,弹奏出的或许就是噪音,同样的音符经过作曲家的手,就可以谱 ...

  6. java中正则全局匹配_JS中正则表达式全局匹配模式/g用法实例

    JS中正则表达式全局匹配模式 /g用法详解 本文章来详细介绍js中正则表达式的全局匹配模式 /g用法, var str = "123#abc"; var re = /abc/ig; ...

  7. 大白话说Java泛型:入门、使用、原理

    文章首发于[博客园-陈树义],点击跳转到原文<大白话说Java泛型:入门.使用.原理> 远在 JDK 1.4 版本的时候,那时候是没有泛型的概念的.当时 Java 程序员们写集合类的代码都 ...

  8. 大白话说Java反射:入门、使用、原理,BAT 面试官 如何面试

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 文章 ...

  9. java 匹配url的正则表达式_java匹配url的正则表达式

    展开全部 给你个正则表达式的资料,自己慢慢研究,授你以渔: 一.正则表达式基础知识 我们先从简单的开始.假设你62616964757a686964616fe78988e69d8331333264623 ...

最新文章

  1. 对未标记为可安全执行的脚本_Script Debugger for Mac(脚本调试软件)
  2. JavaSE—集合框架
  3. AD9910高速集成DDS芯片(芯片阅读笔记-串行模式篇-22个寄存器SPI通信周期控制)
  4. 卡塔尔大学发布全景分割 2021 年最新综述
  5. linux 安装tomcat 权限不足问题
  6. Android GestureDetector方法详解
  7. codefirst 兼容oracle,EF6+MVC5之Oracleo数据库的CodeFirst方式实现
  8. 使用NetBeans Lambda支持在Java 8中使用Lambda表达式对列表进行排序
  9. 输入一颗二元树,从上向下按层打印树的每个节点,同一层中,按照从左到右的顺序打印。...
  10. C++ vector使用示例
  11. ajax iframe的使用方法,使用jQuery和ajax代替iframe的方法(详解)
  12. 配置caffe matlab 中遇到的坑
  13. IE8.0的发展历程之一
  14. Java学习之路-开局
  15. 回首过去展望未来——14年年终总结
  16. mfc , 超简单实现动态背景,
  17. 知乎创意总监、Dine 设计团队创始人 @disinfeqt :设计、音乐
  18. SuperMap GIS 9D(2019)产品白皮书_V2018Q4R1
  19. 职业规划,如何月入1万、3万、5万、10万?
  20. 虚拟机架设冒险岛服务器,冒险岛单机版V139虚拟机版+视频安装教程+139客户端+登录器...

热门文章

  1. 错误:Script file ‘D:\software_install\Anaconda_install\Scripts\pip-script.py‘ is not present.完美解决方法
  2. 如何下载kaggle上的数据集
  3. c语言重定义不同的基类型_简述usb连接器输出类型定义和不同环境下的用法
  4. LeetCode Increasing Triplet Subsequence(动态规划)
  5. libqrencode生成二维码图片的问题
  6. 优秀编程团队需要改善的12件事情
  7. Java 注解用法详解——@SuppressWarnings
  8. iOS - 内购_类型
  9. 词频统计-------------web版本
  10. 11gR2 RAC启用iptables导致节点宕机问题处理