zoukankan      html  css  js  c++  java
  • 正则表达优化

    正则表达式优化

     

    正则表达式执行过程

      1.正则表达式编译:检查正则表达式语法正确性,如果正则,则编译为内部形式

      2.传动开始 传动装置将正则引擎定位到目标字符串起始位置 如:(this subjiect  匹配 subjiect   传动装置则会将起始位置移动到 this "s"处)

      3.引擎开始测试正则表达式和文本

        如:this subjiect  匹配 subjiect

        传动装置将起始位置移动到 this 的"s"处 

    可以看出 从this的"s"开始匹配 表达式第一个字母"s" 匹配成功 继续向下传动匹配" "  显然"s" 表达式匹配失败 交给 "u"匹配 也匹配失败。则回滚 将将匹配位置移动到S前面的" " 位置开始新一轮匹配 表达式s跟" "匹配失败 传动装置继续 移动到下一个位置 进行匹配    最终s匹配subject的s 然后继续匹配u s匹配u失败回溯态 u交给表达式u匹配  匹配成功 表达式u 继续匹配b匹配失败 回溯  交给表达式b去匹配 以此类推 最终匹配 subjiect

    回溯会依次还原之前匹配的状态 知道匹配位置 

    比如上面例子 第一个s匹配成功  保留状态 进行u的匹配匹配失败回溯到上一个状态 匹配s  控制权交给u u匹配u 保留状态su  然后u进行b的匹配 匹配失败 回溯上一个状态 u匹配成功 以此递归

    优化1    避免重复编译

           如果需要在循环内部使用正则表达式。表达式应该声明在程序外部。因为正则表达式第一步是检查语法 然后编译成内部形式执行

    优化2  不要滥用字符组

           比如要文件后缀txt

           [.]txt应改为\.txt

    优化2    避免不必要的回溯

            如匹配name=jon

            正则.+=.+;

            因为正则是贪婪匹配 第一个.+会匹配 到字符结尾。这个时候控制权交给=没有匹配字符则会从最后一个位置依次回溯交还字符 交还到= 然后匹配 最后再根据第二个.+匹配jon

            这个时候我们可以使用[^=]+=[^=]+来匹配。。第一个正则匹配到=匹配失败 交给=进行匹配 =匹配成功  第二个[^=]=在进行匹配 或者\w+=\w+

            使用可以使用固定分组

    优化3 快速定位到正则匹配的起始位置

          如匹配:"属性是 name=jon"

          需要匹配字符串:name=jon

         name=\w+ 快于\w+=\w+  第一个正则会快速定位到name的位置从那里开始匹配 而\w+ 则会从第一个字匹配下来

    优化4 避免不必要的匹配

         如果需要匹配 this  和 that

          th(?:(is|at)) 快于(this|that) 前者会先匹配th  如果th满足才进行分之匹配  后者会根据表达式的每个字符串进行匹配  如果匹配失败再切换到第二个分之进行匹配

  • 相关阅读:
    http简单demo
    启迪思维:循环链表
    数据表行列转换
    防止短时间内重复提交表单数据js约束
    ASP.NET2.0文件上传以及图片处理
    支付宝倒计时代码
    js 定时刷新页面
    C# 将cookiecontainer写到本地
    用C#生成随机中文汉字验证码的基本原理
    删除指定文件夹里的所有文件
  • 原文地址:https://www.cnblogs.com/LQBlog/p/5919709.html
Copyright © 2011-2022 走看看