4.5.6 Possessive Quantifiers andAtomic Grouping
那么,仍然来考虑‘.625’的例子,想想我们真正的目的。我们知道,如果匹配能够进行到「(\.\d\d[1-9]?)▲\d+」中标记的位置,我们就不希望进行回溯。
那么,如果我们能够避免这些备用状态呢?(也就是在[1-9]进行尝试之前,放弃「?」保存的状态)如果没有退路,「1-9」的匹配就不会交还。而这就是我们需要的!
4.5.6.1 Atomic grouping with「(?>…)」
在固化分组匹配结束时,他已经匹配的文本已经固化为一个单元,只能作为整体而保留或放弃。
所以回溯永远也不能选择其中的状态(至少是,当此结构匹配完成时,“锁定(locked in)”在其中的状态)。
示例如下:
#! /usr/bin/perl -w
$price = 9.436;
#$price =~ s/(\.\d\d[1-9]?)\d+/$1/;
# $price =~ s/(\.\d\d[1-9]?)\d*/$1/;
# atomic grouping
$price =~ s/(\.\d\d(?>[1-9])?)/$1/;
print $1;
执行结果:
$perl mre45_32.pl
.436
加上「\d+」后,
执行结果:
$perl mre45_32.pl
Useof uninitialized value $1 inprint at mre45_32.pl line 10.
因为没有能够回溯的备用状态,整体匹配也就失败,‘.436’不需要处理,而这正是我们期望的。
固化分组会放弃某些可能的路径。
放弃备用状态可能会导致的结果:
l毫无影响 如果在使用备用状态之前能够完成匹配,固化分组就不会影响匹配。
l导致匹配失败
l改变匹配结果
l加快报告匹配失败的速度
4.5.7 Possessive Quantifiers, ?+, *+, ++, and {m, n}+
占有优先量词与匹配优先量词很相似,只是他们从来不交还已经匹配的字符。
实际上占有优先量词与固化分组的匹配结果完全一样,只是写起来更加方便而已(而且更加高效)。
修改后的示例:
#! /usr/bin/perl -w
$price = 9.436;
#$price =~ s/(\.\d\d[1-9]?)\d+/$1/;
# $price =~ s/(\.\d\d[1-9]?)\d*/$1/;
# atomic grouping
# $price =~ s/(\.\d\d(?>[1-9])?)d+/$1/;
# Possessive Quantifers
$price =~ s/(\.\d\d[1-9]?+)^\d+/$1/; # Prohibit Match
#price =~ s/(\.\d\d[1-9]?+)/$1/; # Match
print $1;
4.5.8 The Backtracking of Lookaround
在NFA的世界中包含了备用状态和回溯,环视是怎么实现的?
首先,我们要明白环视结构不会去包含备用状态和回溯!
包含了这两个的是子表达式!
然后,
那我们看,子表达式匹配成功时:
肯定型环视会认为自己匹配成功;而否定环视会认为匹配失败。在任何一种情况下,因为关注的只是匹配存在与否,此匹配尝试所在的“世界”(子表达式),包括在尝试中创造的所有备用状态,都会被放弃。
子表达式匹配失败时:
肯定型环视会认为自己匹配失败;而否定环视会认为匹配成功。
最后,我们知道环视、固化分组、占有优先量词他们是一样的!
4.5.8.1 Mimicking atomic grouping with positive lookahead
举例来说,比较「(?>\w+):」和「^(?=(\w+))\1:」
Unlike atomic grouping, the match word isnot included as part of the match (that’s the whole of lookahead), but the worddoes remain captured.
但与固化分组不一样的是,虽然此时确实捕获了这个单词,但是它不是全局匹配的一部分(这就是环视的意义)。
4.5.9 Is Alternation Greedy?
多选结构「…|…|…」既不是匹配优先的,也不是忽略优先的,而是按顺序排列的。
4.5.10 Taking Advantage of Ordered Alternation
要记住的是,如果多选分支是有序的,而能够匹配同样文本的多选分支又不只一个,就要小心安排多选分支的先后顺序。
4.5.10.1 Ordered alternation pitfalls
拆分日期的例子:
使用「Jan(0?[1-9]|[12][0-9]|3[01])」匹配‘Jan 31 is Dad’s birthday’,结果如何呢?我们希望获得的当然是‘Jan 31’,但是有序多选分支只会捕获‘Jan 3’。
所以我们用「Jan([12][0-9]|3[01]|0?[1-9])」可以解决这个问题。但是,看这个表达式很是不好理解~~
分享到:
相关推荐
linux系统shell正则表达式-练习工具和教材 正则表达式-练习工具和教材 正则表达式-练习工具和教材
这是编译原理的一个实验, 是把一个正则表达式转化为不确定有穷自动机NFA的算法程序,朋兴趣的朋友可以下载来看看哦. 一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式...
包括ORACLE+PLSQL正则表达式手册、详细的Javascript正则表达式参考手册、C#字符串和正则表达式参考手册
正则表达式规则及常用正则表达式列举,应该很全了
basics - Bin-block 全局解释器锁练习源码 - Bin-Coroutine 协程练习源码 + Coroutine 协程练习源码 + greenlet 模块 - Bin-Thread 线程练习源码 - Bin-Multiprocessing 多进程练习 - Bin-Re 正则表达式练习 ...
javascript的正则表达式的经典案例详解,从入门到熟练~
基础篇13-python基本数据结构习题解答 基础篇14-答疑课-python里面这些难缠的符号们 基础篇15-答疑课-再议数据结构与数据类型 基础篇16-python语句1.1 基础篇17-python语句1.2 基础篇18-基础篇综合习题 基础篇19-...
学习完正则表达式后,有必要通过一定的习题来检验自己的学习情况
正 则 表 达 式 学 习 笔 记
编译原理课的大作业 包含三个小实验 在一个cpp文件里 正则表达式转换为nfa nfa转换为dfa dfa最小化 个人原创代码
6.11正则化复杂度调节和剪枝 本章小结 文献和历史评述 习题 上机练习 参考文献 ------------------- 第七章随机方法 7.1引言 7.2随机搜索 7.3学习 7.4网络和图示模型 7.5进化方法 7.6规则 本章小结 ...
6.11正则化复杂度调节和剪枝 本章小结 文献和历史评述 习题 上机练习 参考文献 ------------------- 第七章随机方法 7.1引言 7.2随机搜索 7.3学习 7.4网络和图示模型 7.5进化方法 7.6规则 本章小结 ...
这个资源有问题,已损坏,需要的朋友请下载“编译原理第三部分(重发)”,给大家带来麻烦对不起了~~~ 西北工业大学出版,第三版,蓝色封面,课后习题答案,一共三个部分,可单独解压,
这里给大家详细讲解一下一个匹配IP地址的正则表达式, 有关正则方面的知识,会在详细的讲解中提到。 在讲解之前,我先给大家介绍一下,ip地址的生成规则。 IP地址,是由32位数字二进制转为四个十进制的字符串...
此课程较全面的讲解了正则表达式,之后还有习题供做训练。适合初学者。
第 13 讲 Hahn-Banach 定理之应用 第 14 讲 凸集的隔离定理 习 题 二 第三章 共轭空间与共轭算子 第 15 讲 共轭空间的表现 第 16 讲 弱收敛与弱 * 收敛 第 17 讲 共轭算子与紧算子 第 18 讲 自反...
JAVA开发实战经典课后习题讲解第11章:正则习题讲解
编译原理正则式转NFA转DFA以及最小化
包含一些实例,以及课件习题,同样也包含一些可供开发时参考的代码,又陷入深。
第四章详细答案解析 文法与语法分析,文法的二义性,等价文法,算法,正则nfa,dfa到正则文法的转换,判断文法是LL(1)文法,文法分析表,文法分析过程