• 第六章:打造高效正则表达式


    前提:主要是说NFA引擎
    1.匹配的正确性和效率。需要理解引擎的工作原理,关键要理解回溯的工作机制。

    2.在传统NFA中,应该把匹配概率大的分支放在前面,因为传统NFA匹配成功后就继续后面的匹配而不回溯,这样通过减少回溯次数来提高效率。但是POSIX NFA任何情况下都会尝试所以的分支。    这中优化只在匹配成功的情况下有用,因为匹配失败时会尝试所以的分支的。在交换分支的时候需要考虑正确性
    3.限制匹配优先量词的作用范围。在多选分支的某个匹配概率大的分支中使用匹配优先量词,一次性匹配尽可能多的字符,从而减少测试次数以及回溯次数,以及退出和进入多选分支结构的次数,从而提高效率。
    4.对于POSIX NFA如果某表达式受两个匹配优先量词限制,则回溯次数将时天文数字。对于传统NFA和POSIX NFA在匹配失败情况下,尝试次数是和字符串长度成几何增长的
    5.
    6.常用优化技巧
     
    7.引擎工作的步骤
       编译,如果语法没有问题就编译为内部形式
    •    传动开始:将正则引擎定位到目标串的起始位置
    •    元素检测:匹配失败则返回;控制权量词和限制词间轮换;控制权在捕获型括号内外轮换时开销较大
    •    寻找匹配结果:如果有匹配结果传统NFA即报告成功,如果是POSIX NFA则继续尝试,最后从所有匹配中返回最长的
    •    传动装置驱动过程:如果没有匹配,则移动到目标串的下一位置。
    •    匹配失败:目标串的每一个位置都尝试后仍不能匹配则报告匹配失败
     
    8.将重复使用的正则表达式编译并保存,避免重复编译浪费时间
    9.把匹配成功必然会包含的字符(串)提取出来,某些工具可以对目标串做预检查,如果必然出现的字符(串)没有出现则不进行匹配。
     
    10.锚点优化,减少驱动引擎驱动的位置
    11.忽略优先量词通常比匹配优先量词慢
    12.使用占有优先量词和固化分组减少备用状态,如果分组和后面的字符没有重叠,则可以做这样的优化。eg:  \%(w+):
     
  • 相关阅读:
    新的一周了
    一篇感人的文章!
    bit流中统计1的个数
    TASK_KILLABLE
    modutils及LKM分析小记[2]
    __asm__ __volatile__("": : :"memory")
    内核同步小记
    进程劫持
    加载内核模块
    missing separator
  • 原文地址:https://www.cnblogs.com/manziluo/p/5788317.html
Copyright © 2020-2023  润新知