`
zhengalways
  • 浏览: 14606 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

原子组与防止回溯 [正则表达式]

阅读更多
原子组与防止回溯

在一些特殊情况下,因为回溯会使得引擎的效率极其低下。

让我们看一个例子:要匹配这样的字串,字串中的每个字段间用逗号做分隔符,第12个字段由P开头。

我们容易想到这样的正则表达式<<^(.*?,){11}P>>。这个正则表达式在正常情况下工作的很好。但是在极端情况下,如果第12个字段不是由P开头,则会发生灾难性的回溯。如要搜索的字串为“1,2,3,4,5,6,7,8,9,10,11,12,13”。首先,正则表达式一直成功匹配直到第12个字符。这时,前面的正则表达式消耗的字串为“1,2,3,4,5,6,7,8,9,10,11,”,到了下一个字符,<<P>>并不匹配“12”。所以引擎进行回溯,这时正则表达式消耗的字串为“1,2,3,4,5,6,7,8,9,10,11”。继续下一次匹配过程,下一个正则符号为点号<<.>>,可以匹配下一个逗号“,”。然而<<,>>并不匹配字符“12”中的“1”。匹配失败,继续回溯。大家可以想象,这样的回溯组合是个非常大的数量。因此可能会造成引擎崩溃。

用于阻止这样巨大的回溯有几种方案:

一种简单的方案是尽可能的使匹配精确。用取反字符集代替点号。例如我们用如下正则表达式<<^([^,\r\n]*,){11}P>>,这样可以使失败回溯的次数下降到11次。

另一种方案是使用原子组。

原子组的目的是使正则引擎失败的更快一点。因此可以有效的阻止海量回溯。原子组的语法是<<(?>正则表达式)>>。位于(?>)之间的所有正则表达式都会被认为是一个单一的正则符号。一旦匹配失败,引擎将会回溯到原子组前面的正则表达式部分。前面的例子用原子组可以表达成<<^(?>(.*?,){11})P>>。一旦第十二个字段匹配失败,引擎回溯到原子组前面的<<^>>。
分享到:
评论

相关推荐

    深入浅出正则表达式

    1. 什么是正则表达式 2 2. 不同的正则表达式引擎 2 3. 文字符号 2 4. 正则表达式引擎的内部工作机制...13. 原子组与防止回溯 14 14. 向前查看与向后查看 14 15. 正则表达式中的条件测试 17 16. 为正则表达式添加注释 17

    PHP正则表达式之定界符和原子介绍

    先来看一下正则表达式的定界符、正则表达式的构成以及preg_match()函数: 1,正则表达式的定界符。 除了字母、数字和反斜线\以外的任何字符都可以为定界符号,比如 | |、//、{}、!!等等,但是需要注意,如果没有...

    PHP中的正则表达式函数介绍

    正则表达式(Regular Expression) 正则表达式系统: 1.POSIX 2.Perl PHP中使用的regex是...一个正则表达式最少含有一个原子 3.当需要匹配诸如”(“、”[“、”^”等含有语义的符号时需要用”\”反斜线进行转义 原子字符:

    正则表达式教程之模式修正符使用介绍

    之前我们给大家介绍了正则表达式中的定界符、原子和元字符,那么我们关于正则表达式教程的基本语法就剩下了正则表达式中的模式修正符。本节会向大家介绍模式修正符的概念、模式修正符的构成,以及结合实例的模式修正...

    PHP 正则表达式函数库(两套)

    在PHP中有两套正则表达式函数库,两者功能相似,只是执行效率略有差异: 一套是由PCRE(Perl Compatible Regular Expression... 一个正则表达式中至少包含一个原子。 原子(普通字符,如英文字符) 元字符(有特殊功用

    PHP中基于perl的正则表达式处理函数

    前面我们已经学习了正则表达式的基础语法,包括了定界符、原子、元字符和模式修正 符。实际上正则表达式想要起作用的话,就必须借用正则表达式处理函数。本节我们就来介绍一下PHP中基于perl的正则表达式处理函数,...

    利用rdkit将smiles转化为原子坐标键数据,并用正则表达式将数据提取

    from rdkit import Chem from rdkit.Chem import AllChem # from rdkit.Chem import Draw import re # 读取 SMILES 字符串 smiles = "CC(=O)OC1=CC=CC=C1C(=O)O" # smiles = "C1=CC=CC=C1" mol = Chem.MolFromSmiles...

    PHP正则表达式笔记与实例详解

    本文实例讲述了PHP正则表达式笔记与实例。分享给大家供大家参考,具体如下: 这里主要介绍如何在PHP使用正则表达式,并附带几个实例. 这两天工作用到了正则表达式,发现自己已经忘记的差不多了,囧啊!找来以前的学习...

    正则表达式 学习笔记

    #原子: \d 表示0~9之间的任意【一个】字符-&gt;[0-9]自定义原子列表 \D 表示除了0~9之外的任意【一个字符】-&gt;[^0-9]自定义排除列表 \s 表示任意【一个】空白字符(不可见字符)-&gt;[\n\r\t\v\f]自定义原子列表 \S 表示任意...

    读取gjf文件内容(使用python正则表达式读取高斯输出文件的内容)

    使用python正则表达式读取高斯输出文件的内容,atom_info是所有原子名称存储文件,其余gjf文件是提供的例子,在py文件中可以修改文件名来读取不同gjf文件 读取后格式:([[-0.2131818033333333, -0.30164527666666663...

    PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)

    前面我们已经学习了正则表达式的基础语法,包括了定界符、原子、元字符和模式修正 符。实际上正则表达式想要起作用的话,就必须借用正则表达式处理函数。本节我们就来介绍一下PHP中基于perl的正则表达式处理函数,...

    PHP100视频教程 36:PHP中正则表达式学习及应用(一)

    (有特殊功能的字符) (3)、模式修正符 (系统内置部分字符 i 、m、S、U…)4、正则表达式中的“原子”①a-z A-Z _ 0-9 //最常见的字符②(abc) (skd) //用圆括号包含起来的单元符合③[abcs] [^abd] //用方括号...

    PHP学习正则表达式 课件第1/2页

    正则表达式 在PHP中有两套正则表达式函数库,两者功能相似,只是执行效率略有差异: 一套是由PCRE(Perl Compatible Regular Expression)库提供的。... 一个正则表达式中至少包含一个原子。 原子(普通字符,如

    PHP 正则表达式小结

    说明:mode参数—- 正则的模块,也就是正则表达式(语法) subject参数—- 正则的内容 matches参数—- 正则的结果(获得一个数组的形式) b.ereg 正则函数,以POSIX基础(Unix、Script) 语法:ereg(mode ,string ...

    compile-time-regular-expressions:与编译时PCRE(几乎)兼容的正则表达式匹配器

    编译时正则表达式v3 快速的编译时正则表达式,支持在编译时或运行时进行匹配/搜索/捕获。 您可以使用目录single-header的单头版本。 可以使用make single-header重新生成此make single-header 。 如果使用cmake,则...

    gnome-shell-window-search-provider:Gnome Shell Extension for 3.16+(可能更低),可使用模糊搜索或正则表达式搜索当前窗口

    如果您以“ /”开始搜索,它将把所有搜索词(用空格分隔)解释为正则表达式,必须全部匹配。 此扩展程序的灵感来自 特征 模糊匹配当前打开的窗口并激活选定的窗口 使用正则表达式以“ /”(空格用“。*?”代替)...

    零基础学习python及爬虫

    example-8.py 正则表达式-原子 example-9.py 正则表达式-元字符 example-10.py 正则表达式-模式修正符 example-11.py 正则表达式-贪婪模式和懒惰模式 example-12.py 简单爬虫的编写(urllib学习) example-13.py 超时...

    PHP下常用正则表达式整理

    匹配模块必须以 / / 开始和结束,第二个 / 后可以加模式修正符 原子 ①a-z A-Z _ 0-9 //最常见的字符 ②(abc) //用圆括号括起来起来的单元符号 ③[abcs] [^abd] //用方括号括起来的原子表, 原子表中的^代表排

    PHP100视频教程 36:PHP中正则表达式学习及应用(一).rar

    4、正则表达式中的“原子”①a-z A-Z _ 0-9 //最常见的字符 ②(abc) (skd) //用圆括号包含起来的单元符合 ③[abcs] [^abd] //用方括号包含的原子表,原子表中的^代表排除或相反内容 ④转义字符  \d 包含所有...

Global site tag (gtag.js) - Google Analytics