原则一:优先选择最左端(最靠开头)的匹配结果
  根据这条规则,起始位置最靠左端的匹配结果总是优先于其他可能的匹配结果。这里没有规定优先匹配结果的长度,而只是规定,在所有可能的匹配结果中,优先选择开始位置靠左端的。
  匹配过程:正则匹配先从需要查找的字符串的起始位置开始,尝试匹配整个表达式能匹配的所有样式文本,如果在当前位置测试了所有可能之后不能找到匹配结果,正则引擎就是启动传动装置向右移动一个位置,也就是从字符串的第二个字符之前的位置开始重新尝试。在找到匹配结果以前必须在所有位置重复此过程。只能在尝试了所有位置(从第一个字符直到最后一个字符)都不能匹配结果的情况下,才会报告“匹配失败”。
所以如果用ee来匹配abeen的话,从字符串开始第一轮尝试失败(因为ee不能匹配ab),第二轮尝试也失败(因为ee也不能匹配be),直到第三软尝试能够成功,引擎会停止下来报告匹配ee成功.
  如果不了解这个规则,有时候就不能理解匹配的结果。如用abeen来匹配:“this is 123abeen321 test by abeen”. 结果会是123abeen321中的abeen被匹配,而不是最后的abeen。

原则二:标准的匹配量词*、+、?、{min, max}是匹配优先的
    标准量词是匹配的,在匹配成功之前,进行尝试的次数是存在上限和下限的,匹配优先量词之所以得名,是因为他们总是(或者至少是尝试)匹配多于匹配成功下限的字符。也就是说,标准匹配量词的结果可能并非所有可能结果中最长的,但它们总是尝试匹配可能多的字符,直到匹配上限为止。
    例如: [0-9]+为什么能匹配ABeen 19820527 中的所有数字。1匹配成功之后,实际上已经满足了成功的下限,但此表达式是匹配优先的,所以它不会停止在此处,而会继续下去。继续匹配19820527,直到字符串结束。
过度的匹配优先
  ^.*(?<Test>[0-9][0-9])能够匹配一行字符串的最后两位数字,如果有的话将它们存于Test 组中。来看一下匹配过程, .* 首先匹配整行,而[0-9][0-9]是必须匹配的,在尝试匹配行末的时候会失败,它样它会通知.*自己没法匹配了,为了大局着想,大哥你还是交出点来吧。于是.*很有大哥风范,以大局为重交出一个字符,如果不够还会继续交出字符。当然前提是大哥得先留下自己那份,也就是匹配成功的下限。
    我们来看 ^.*(?<Test>[0-9][0-9]) 匹配 this is a test abeen 1982abeen的过程。.*首先匹配整个字符串以后,第一个[0-9]的匹配要求.*释放一个字符n,但是[0-9]还不能匹配,所以.*必须继续交还字符e,如此循环只到交还2为止。但不幸的是第一个[0-9]匹配成功后,第二个[0-9]不能匹配成功,于是.*大哥再次以大局为重,又释放一个字符8,这样整个表达式就匹配成功,结果是this is a test abeen 1982,Test内容为82.
先来先服务
    如果想用^.*(?<Test>[0-9]+)来匹配一行的最后整个数字,比如匹配this is a test abeen 1982,结果Test只捕获了2,这是为什么呢? 
    你的本意也许是想捕获1982,但结果为什么是2呢!首先.*会捕获整个字符串,然后[0-9]+必须要捕获( 注意是必须)一个数字,所以.*交还了一个2出来,接下来整个表达式中没有必须要匹配的元素了,所以.*不会再交还字符。结果Test只能捕获2了。
  这就是“先来先服务”原则,匹配优先的结构只会在被迫的情况下交还字符。

[Regular] 4、正则表达式的匹配原理原则相关推荐

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

    本节第一部分主要介绍正则引擎的分类,由于java属于NFA,所以只重点介绍此类.其余类型简要或不做介绍. 分类的内容全部来自<精通正则表达式>v3 引擎类型 程序 DFA awk(大多数版 ...

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

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

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

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

  4. 正则学习(2)--- 简单匹配原理

    写写对简单的匹配原理的理解,还是以php为主. 首先,正则引擎主要可分为两大类:DFA和NFA,反正引擎见多了就不奇怪了,简单理解就是不同的匹配方式,就好比在数组中查找数据时,有的是从头开始顺序,查找 ...

  5. 正则表达式引擎执行原理——从未如此清晰!

    目前越来越多的网站.编辑器.编程语言都已支持一种叫"正则表达式"的字符串查找"公式",有过编程经验的同学都应该了解正则表达式(Regular Expressio ...

  6. linux绑定中文域名,linux shell正则表达式如何匹配域名(包含中文域名)

    linux shell正则表达式如何匹配域名(包含中文) shell匹配域名 1. 匹配示例 最近的项目需要校验一下域名格式匹配,百度一下,说明如下: DNS规定,域名中的标号都由英文字母和数字组成, ...

  7. Python Re 正则表达式 数据匹配提取 基本使用

    Python re 正则表达式 数据匹配提取 基本使用 小洲提示:代码可直接复制在编译器中运行,方便更好的理解 文章目录 Python re 正则表达式 数据匹配提取 基本使用 前言 一.导入库,内置 ...

  8. python如何打出英文括号_用python的re(正则表达式)模块匹配英文环境下的括号

    在用re(正则表达式)模块匹配掉文本中的括号时,总是出现各种各样的问题,经过将近一个小时的摸索,终于找到了问题的所在. 案例: 将 txt = 'Linux系统安装 - 1.1(Av20994127, ...

  9. c语言匹配英文,正则英语_正则表达式怎么匹配英文句子_淘题吧

    ⑴ 正则表达式怎么匹配英文句子 如果只需要匹配任意一句话的话,可以这样写:(.|[\u4e00-\u9fa5])+.注:第一个点是小数点,最后面是一个中文句号希望可以帮到你! ⑵ "正则表达 ...

最新文章

  1. Hadoop hdfs完全分布式搭建教程
  2. 扁平化职能管理三部曲
  3. rust投递箱连接箱子_灭火器箱存在的必要性
  4. 鸿蒙系统手机用户体验,鸿蒙系统真的来了!用户体验流畅度远超安卓,任正非扳回一城!...
  5. java Class对象返回的都是指向同一个java堆地址上的Class引用
  6. python与网页设计的区别_Python与设计模式(三):行为型模式(上)
  7. c语言中用于获取字符串长度的函数是,C语言中求字符串长度的函数的几种实现方法...
  8. poj 1609 Tiling Up Blocks 动态规划
  9. ps、ai、cdr2021平面设计三大软件的区别有哪些?
  10. 浅谈React Hooks
  11. 队列——数组实现和链式实现
  12. js基础-12-判断数组和判断对象的方法
  13. 2021-2027全球与中国触摸屏人机界面(HMI)市场现状及未来发展趋势
  14. html5_滑条等其他标签
  15. 武林传奇之七剑下天山java游戏开发商_武林传奇2 之七剑下天山的配方
  16. 线稿上色V3(比V2差别在于这个参考图的处理方式),并且更好用哦
  17. JAVA渣渣感悟——三目运算符(三元运算符)的注意事项
  18. kaggle中的房价预测的一些数据分析方法详解
  19. 一命二运三风水,四积功德五读书。六名七相八敬神,九交贵人十养生。
  20. 程序员如何抉择银行技术岗?

热门文章

  1. CSS显示属性上的过渡
  2. 如何生成随机的字母数字字符串?
  3. Gitlab 服务器搭建,maven安装与jdk安装,linux下安装git
  4. AT指令:AT+CMGF
  5. IoT:电子密本ECB和DES模式详解
  6. 电脑软件上的按钮原来是这样来的:按钮组件
  7. HoloLens1开发(三):Trilib插件动态加载模型-Part1
  8. iview 远程搜索选择器方法使用,选择之后清空选择的项
  9. JavaScript:变量提升作用域
  10. 前后端交互总结2:使用PHP进行表单数据上传与更新