正则表达式匹配原理

正则表达式匹配原理:
本章节将会简单的介绍一下正则表达式匹配原理,这将有助于书写更为有效率的正则表达式,而不仅仅能够完成匹配任务。
一.关于正则表达式引擎:
正则引擎大体上可分为不同的两类:DFA和NFA。
1.DFA是Deterministic finite automaton的缩写,确定型有穷自动机。
2.NFA是Non-deterministic finite automaton的缩写,非确定型有穷自动机。NFA又可以分为两类:
1): Traditional NFA,传统型非确定有穷自动。
2): POSIX NFA,符合标准的非确定型有穷自动机。
DFA引擎不需要进行回溯,所以匹配效率一般情况下要高,但是它并不支持捕获组,于是也就不支持反向引用和$这种形式的引用。
POSIX NFA是指符合POSIX 标准的NFA引擎,它的主要特点是提供longest-leftmost匹配,也就是说在找到最左侧最长匹配之前,它将继续回溯,此种引擎对非贪婪模式不支持。
当前大多数语言都是使用传统型NFA正则引擎,因为它更为强大灵活。
二.字符串的组成:
想要真正理解正则表达式的匹配原理,那么首先就要知道在正则表达式眼中,字符串是由哪些成分构成的,图示如下:

上面的图片得出,字符串不但由字符组成,还包括字符之间的位置。对于字符串"antzone"而言,它是由7个字符和8个位置构成。

三.零宽和占有字符表达式:

在正则表达式中,如果子表达式匹配到的是字符内容,而非位置,并且会被保存到匹配结果中,那么这个子表达式是占有字符的。如果子表达式匹配的是位置,或者匹配的内容不被保存在最终结果中,那么就认为这个子表达式是零宽的。

占有字符是互斥的,零宽度是非互斥的。也就是一个字符,同一时间只能由一个子表达式匹配,而一个位置,却可以同时由多个零宽度的子表达式匹配。

注意:这里所说的子表达式并非只有用小括号括起来的表达式,而是正则表达式中的任意匹配单元。
四.控制权的传动:
正则表达式当开始匹配的时候,一般是由一个子表达式获取控制权,从字符串中的某一个位置开始尝试匹配,一个子表达式开始尝试匹配的位置,是从前一子表达匹配成功的结束位置开始的,看下面的例子:
(子表达式一)(子表达式二)
如果子表达式一是零宽度的,那么它的匹配起始位置和结束位置是同一个位置,如果位置是0,那么子表达式二将从位置0进行匹配。
如果子表达式一是占有字符的,开始匹配位置0,结束匹配位置是4,那么子表达式二的开始匹配位置就是4。
五.正则表达式匹配分解:
分解演示一:
1.将要进行匹配的字符串:"antzone"。
2.正则表达式:/zone/。
匹配过程如下:
首先由正则表达式中字符"z"取得控制权,然后去尝试匹配字符串中的第一个字符"a",匹配失败,则继续尝试第二个字符"n"依然会失败,直到字符"z",匹配成功,这样控制权由正则表达式中的字符"z"传递给字符"o",由于字符"z"已经被匹配,所以字符"o"将会从位置4开始匹配,由"o"来匹配"o",匹配成功,这样依次传递下去,最终正则表达式匹配成功,匹配结果为"zone"。
实例如下:

var str="antzone";
var reg=/zone/;
console.log(str.match(reg));

分解演示二:
1.将要进行匹配的字符串:"antzone"。
2.正则表达式:/\ban?t/。
匹配过程如下:
首先由正则表达式中的元字符\b取得控制权,开始去尝试匹配字符串"antzone",它匹配的是单词边界位置,匹配成功后,控制权交给正则表达式字符"a",由于"\b"是零宽的,所以"a"从位置0开始匹配,匹配字符"a"成功,然后将控制权交给"n?",由于“?”是匹配优先量词(同时记录一个备选状态,如果匹配不成功则进行回溯),所以会先尝试进行匹配,能够成功"n",控制权然后交给字符"t",也能够匹配成功,匹配结果为:"ant"。
实例如下:

var str="antzone";
var reg=/\ban?t/;
console.log(str.match(reg));
时间: 2024-10-03 16:59:55

正则表达式匹配原理的相关文章

正则表达式匹配解析过程探讨分析(正则表达式匹配原理)

已经有多篇关于正则表达式介绍的文章,随着我们越来越多使用正则表达式,想对性能做优化.减少我们正则表达式书写匹配Bug.我们不得不进一步深入了解正则表达式执行过程了.下面我们一起学习,分析下正则表达式执行过程.我们会用regexbuddy测试工具分解执行过程,具体工具使用,可以看:正则表达式性能测试工具推荐.优化工具推荐(regexbuddy推荐).要了解正则表达式解析过程前,我们先来熟悉几个概念. 常见正则表达式引擎 引擎决定了正则表达式匹配方法及内部搜索过程,了解它至关重要的.目前主要流行引擎

正则表达式匹配回溯

正则表达式匹配回溯:一.基本概念:NFA引擎的正则表达式会依次处理各个子表达式或者组成元素,遇到需要在两个都可能进行成功匹配的子表达式或者组成元素之间进行选择的时候,会首先选择其一,同时会记录另一个的状态,以备后面使用.注意:这里所说的子表达式并非只有用小括号括起来的表达式,而是正则表达式中的任意匹配单元.二.需要回溯的情况:无论是哪一种选择,如果本身匹配成功,而且正则表达式余下的部分也能够成功匹配的话,那么整个匹配就成功了,如果正则表达式当前选择或者后面的部分无法匹配成功,那么正则表达式引擎会

NFA引擎匹配原理

1       为什么要了解引擎匹配原理 一个个音符杂乱无章的组合在一起,弹奏出的或许就是噪音,同样的音符经过作曲家的手,就可以谱出非常动听的乐曲,一个演奏者同样可以照着乐谱奏出动听的乐曲,但他/她或许不知道该如何去改变音符的组合,使得乐曲更动听. 作为正则的使用者也一样,不懂正则引擎原理的情况下,同样可以写出满足需求的正则,但是不知道原理,却很难写出高效且没有隐患的正则.所以对于经常使用正则,或是有兴趣深入学习正则的人,还是有必要了解一下正则引擎的匹配原理的. 2       正则表达式引擎

正则表达式匹配/data/misc/wifi/wpa_supplicant.conf的WiFi名称与密码

正则表达式匹配/data/misc/wifi/wpa_supplicant.conf的WiFi名称与密码: String regex_name="ssid=\"(.*?)\""; String regex_psk="psk=\"(.*?)\""; 核心代码: Pattern p_name=Pattern.compile(regex_name); Pattern p_psk=Pattern.compile(regex_psk);

PHP 正则表达式匹配 preg_match 与 preg_match_all 函数

--http://www.5idev.com/p-php_preg_match.shtml 正则表达式在 PHP 中的应用 在 PHP 应用中,正则表达式主要用于: 正则匹配:根据正则表达式匹配相应的内容 正则替换:根据正则表达式匹配内容并替换 正则分割:根据正则表达式分割字符串 在 PHP 中有两类正则表达式函数,一类是 Perl 兼容正则表达式函数,一类是 POSIX 扩展正则表达式函数.二者差别不大,而且推荐使用Perl 兼容正则表达式函数,因此下文都是以 Perl 兼容正则表达式函数为例

正则表达式匹配包括换行符的所有字符

今天在Java中想使用正则表达式来获取一段文本中的任意字符. (.*) 结果运行之后才发现,无法获得换行之后的文本.于是查了一下手册,才发现正则表达式中,"."(点符号)匹配的是除了换行符"\n"以外的所有字符. 查出了一个解决办法,经过一试,果然可以匹配包括换行符在内的任意字符,以下为正确的正则表达式匹配规则: ([\s\S]*)正则表达式匹配包括换行符的所有字符,布布扣,bubuko.com

使用正则表达式匹配IP地址

如何使用正则表达式匹配IP地址?这是很常见的任务.说难也难,说易也易,取决于在匹配的精确度以及正则表达式复杂度之间很好的折中. 通常,IP地址以点分十进制方式表示,IP地址分为4段,以点号分隔.要对IP地址进行匹配,首先要对其进行分析.0.0.0.0 - 255.255.255.255 一个简单的正则表达式: [0-9]+(?:\.[0-9]+){0,3} 或者 ^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$ 它能够完成我们的任务,但是像"3948.3.89.34238"

PHP 正则表达式匹配 img ,PHP 正则提取或替换图片 img 标记中的任意属性。

PHP正则提取或替换img标记属性 PHP 正则表达式匹配 img ,PHP 正则提取或替换图片 img 标记中的任意属性. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <?php /*PHP正则提取图片img标记中的任意属性*/ $str = '<center><img src="/uploads/images/20100516000.jpg"

用正则表达式匹配汉字,完整总结

提到用正则表达式匹配汉字,很容易搜到这个[\u4e00-\u9fa5],但是它不算全面,不包含一些生僻汉字. 本文对此问题做一个梳理. 以下是比较全面的汉字Unicode分布,截止Unicode 8.0标准(2015年6月): 区块 范围 实际汉字个数 正则式 CJK统一汉字 4E00-62FF, 6300-77FF, 7800-8CFF, 8D00-9FFF. 20,950 [\u4E00-\u9FFF] CJK统一汉字扩展A区 3400-4DBF. 6,582 [\u3400-\u4DBF]