[Regular] 4、正则表达式的匹配原理原则
原则一:优先选择最左端(最靠开头)的匹配结果
根据这条规则,起始位置最靠左端的匹配结果总是优先于其他可能的匹配结果。这里没有规定优先匹配结果的长度,而只是规定,在所有可能的匹配结果中,优先选择开始位置靠左端的。
匹配过程:正则匹配先从需要查找的字符串的起始位置开始,尝试匹配整个表达式能匹配的所有样式文本,如果在当前位置测试了所有可能之后不能找到匹配结果,正则引擎就是启动传动装置向右移动一个位置,也就是从字符串的第二个字符之前的位置开始重新尝试。在找到匹配结果以前必须在所有位置重复此过程。只能在尝试了所有位置(从第一个字符直到最后一个字符)都不能匹配结果的情况下,才会报告“匹配失败”。
所以如果用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、正则表达式的匹配原理原则相关推荐
- 深入入门正则表达式(java) - 匹配原理 - 1 - 引擎分类与普适原则
本节第一部分主要介绍正则引擎的分类,由于java属于NFA,所以只重点介绍此类.其余类型简要或不做介绍. 分类的内容全部来自<精通正则表达式>v3 引擎类型 程序 DFA awk(大多数版 ...
- 正则表达式(三)—— 正则的匹配原理
正则的匹配原理 正则引擎的分类 正则引擎主要可以分为三类:DFA.传统NFA(Traditional NFA)和POSIX NFA. 用了这么久的正则,js属于哪一种呢? 测试引擎的类型 是否是传统型 ...
- 正则表达式之 NFA 引擎匹配原理详解
文章目录 一.为什么要了解引擎匹配原理 二.正则表达式引擎 三.预备知识 (一)字符串组成 (二)占有字符和零宽度 (三)控制权和传动 四.正则表达式简单匹本过程 (一)基础匹配过程 (二)含有匹配优 ...
- 正则学习(2)--- 简单匹配原理
写写对简单的匹配原理的理解,还是以php为主. 首先,正则引擎主要可分为两大类:DFA和NFA,反正引擎见多了就不奇怪了,简单理解就是不同的匹配方式,就好比在数组中查找数据时,有的是从头开始顺序,查找 ...
- 正则表达式引擎执行原理——从未如此清晰!
目前越来越多的网站.编辑器.编程语言都已支持一种叫"正则表达式"的字符串查找"公式",有过编程经验的同学都应该了解正则表达式(Regular Expressio ...
- linux绑定中文域名,linux shell正则表达式如何匹配域名(包含中文域名)
linux shell正则表达式如何匹配域名(包含中文) shell匹配域名 1. 匹配示例 最近的项目需要校验一下域名格式匹配,百度一下,说明如下: DNS规定,域名中的标号都由英文字母和数字组成, ...
- Python Re 正则表达式 数据匹配提取 基本使用
Python re 正则表达式 数据匹配提取 基本使用 小洲提示:代码可直接复制在编译器中运行,方便更好的理解 文章目录 Python re 正则表达式 数据匹配提取 基本使用 前言 一.导入库,内置 ...
- python如何打出英文括号_用python的re(正则表达式)模块匹配英文环境下的括号
在用re(正则表达式)模块匹配掉文本中的括号时,总是出现各种各样的问题,经过将近一个小时的摸索,终于找到了问题的所在. 案例: 将 txt = 'Linux系统安装 - 1.1(Av20994127, ...
- c语言匹配英文,正则英语_正则表达式怎么匹配英文句子_淘题吧
⑴ 正则表达式怎么匹配英文句子 如果只需要匹配任意一句话的话,可以这样写:(.|[\u4e00-\u9fa5])+.注:第一个点是小数点,最后面是一个中文句号希望可以帮到你! ⑵ "正则表达 ...
最新文章
- Hadoop hdfs完全分布式搭建教程
- 扁平化职能管理三部曲
- rust投递箱连接箱子_灭火器箱存在的必要性
- 鸿蒙系统手机用户体验,鸿蒙系统真的来了!用户体验流畅度远超安卓,任正非扳回一城!...
- java Class对象返回的都是指向同一个java堆地址上的Class引用
- python与网页设计的区别_Python与设计模式(三):行为型模式(上)
- c语言中用于获取字符串长度的函数是,C语言中求字符串长度的函数的几种实现方法...
- poj 1609 Tiling Up Blocks 动态规划
- ps、ai、cdr2021平面设计三大软件的区别有哪些?
- 浅谈React Hooks
- 队列——数组实现和链式实现
- js基础-12-判断数组和判断对象的方法
- 2021-2027全球与中国触摸屏人机界面(HMI)市场现状及未来发展趋势
- html5_滑条等其他标签
- 武林传奇之七剑下天山java游戏开发商_武林传奇2 之七剑下天山的配方
- 线稿上色V3(比V2差别在于这个参考图的处理方式),并且更好用哦
- JAVA渣渣感悟——三目运算符(三元运算符)的注意事项
- kaggle中的房价预测的一些数据分析方法详解
- 一命二运三风水,四积功德五读书。六名七相八敬神,九交贵人十养生。
- 程序员如何抉择银行技术岗?