最近了解了下有关正则表达式回溯的内容,想想就写下来,方便自己。

正则表达式匹配算法是建立在正则表达式引擎的基础上的,目前有两种引擎:DFA(确定型有穷自动机)和NFA(不确定型有穷自动机)。这两种引擎的区别主要在于被匹配对象不同。

DFA是用文本去匹配表达式。而NFA是用表达式去匹配文本。这个了解一下就信了。目前我们用的是NFA自动机。

为什么有时候正则表达式的使用会导致CPU飙升呢?这个与正则表达式的回溯有关。什么就正则表达式的回溯以及为什么会发生回溯呢?请看下面的例子。

regex="b{1,3}ac";

text="bbac";

表达式在匹配文本的时候是一个一个的去校验。b{1,3}表示最少出现一个b,最多3个b连续出现。这样在我们的文本中出现了连续的两个b,所以文本是符合这条表达式的。但是由于NFA的贪婪特性,也就是会更多的去匹配文本。表达式会用第三个b去和文本中的所处第三位置的a去匹配,结果不符合。这样就结束了吗?并没有,接下来表达式会在已经匹配的三个字符中“吐”出字符a,这就是回溯。然后就从表达式中的a开始逐一匹配剩余文本ac。直到结束。

如果想要解决这种问题,就需要改变表达式的匹配模式。表达式有三种模式:贪婪模式、懒惰模式、独占模式。

刚刚我们所用到的是贪婪模式,尽可能多的去匹配。

而懒惰模式,尽可能少的去匹配,但仍会发生回溯。独占模式,尽可能多的去匹配,但不回溯。

那如何将表达式改为懒惰模式呢:

regex="b{1,3}?ac";

独立模式呢?

regex="b{1,3}+ac";这种就可以解决回溯的问题。

这些只是个人的理解,有什么不足之处,还望指出,如果不理解的可以参考:http://www.cnblogs.com/study-everyday/p/7426862.html。希望对你有所帮助。

正则表达式回溯-导致CPU偏高的更多相关文章

  1. 正则表达式回溯导致的CPU打满

    参考: https://my.oschina.net/ttscjr/blog/2208526 https://mp.weixin.qq.com/s?__biz=MzA4MjIyNTY0MQ==& ...

  2. 记一次查内存异常问题(续《记一次Web应用CPU偏高》)

    继上一次查应用的CPU飙高问题(http://www.cnblogs.com/hzmark/p/JVM_CPU.html)过去10天了.上次只是定位到了是一个第三方包占用了大量的CPU使用,但没有细致 ...

  3. 记一次Web应用CPU偏高

    LZ开发的一个公司内部应用供查询HIVE数据使用.部署上线后总是会出现CPU偏高的情况,而且本地测试很难重现.之前出现几次都是通过直接重启后继续使用,因为是内部使用,重启一下也没有很大影响(当然,每次 ...

  4. 一次FGC导致CPU飙高的排查过程

    今天测试团队反馈说,服务A的响应很慢,我在想,测试环境也会慢?于是我自己用postman请求了一下接口,真的很慢,竟然要2s左右,正常就50ms左右的. 于是去测试服务器看了一下,发现服务器负载很高, ...

  5. 记一次yarn导致cpu飙高的异常排查经历

    yarn就先不介绍了,这次排坑经历还是有收获的,从日志到堆栈信息再到源码,很有意思,下面听我说 问题描述: 集群一台NodeManager的cpu负载飙高. 进程还在但是看日志已经不再向Resourc ...

  6. C#正则表达式引发的CPU跑高问题以及解决方法

    3月23日(周日)下午16:30左右,博客园主站负载均衡中的2台Web服务器CPU玩起了爬楼梯的游戏(见上图),一直爬到了接近100%.发现这个状况后,我们立即将这2台阿里云临时磁盘云服务器从负载均衡 ...

  7. java 快速定位线上cpu偏高

    1.top -c 加 大写P 查找高进程ID 2.top -Hp 加 大写 P 查找高线程ID 3.printf '%x\n' 线程ID 转成16进制 4.jstack 进程ID | grep 16进 ...

  8. 查询执行成本高(查询访问表数据行数多)而导致实例 CPU 使用率高是 MySQL 非常常见的问题

    MySQL CPU 使用率高的原因和解决方法_产品性能_常见问题_云数据库 RDS 版-阿里云 https://help.aliyun.com/knowledge_detail/51587.html ...

  9. Visual Studio 2012安装VASSISTX插件后导致CPU高的解决的方法

    笔者一直都喜欢用VAX插件来做C++的开发,但发现VS2012安装了VAX后,CPU占用超级高,有时界面卡死得很厉害.我卸了又装,升级最新版,都无论用. 直到有天.看到网友说:VS2012的sdf文件 ...

随机推荐

  1. Does Windows have a limit of 2000 threads per process?

    http://blogs.msdn.com/b/oldnewthing/archive/2005/07/29/444912.aspx Often I see people asking why the ...

  2. git问题记录

    1.从远程仓库拉取A文件,在本地删掉了这个A文件,然后再去拉取远程仓库,是拉不下来的,因为本地版本库比远程库的高 我觉得是第一次远程的版本已经拉取了,本地已记录,远程程没有发生变化,在拉取和先前的一致 ...

  3. Maria数据库

    项目上要进行数据库选型,业务上来讲,数据是非常结构化的数据,使用传统关系数据库更适合:另外项目采用微服务框架,每个服务的数据库应该尽可能轻量级, 最后考虑Maria数据库. MariaDB简介: Ma ...

  4. Python Twisted系列教程13:使用Deferred新功能实现新客户端

    作者:dave@http://krondo.com/deferred-all-the-way-down/  译者:杨晓伟(采用意译) 你可以从这里从头阅读这个系列. 介绍 回忆下第10部分中的客户端5 ...

  5. phpStudy启动失败时的解决方法 提示缺vc9运行库

    问题描述: 问题产生原因分析: php5.3.5.4和apache都是用vc9编译,电脑必须安装vc9运行库才能运行. php5.5.5.6是vc11编译,如用php5.5.5.6必须安装vc11运行 ...

  6. Java面向对象-Java类的继承及super关键字

    Java面向对象-Java类的继承 1,继承定义以及基本使用 定义:子类能够继承父类的属性和方法: 注意点:Java中只支持单继承: 私有方法不能继承: 上代码: package com.java12 ...

  7. CentOS Firewall简单使用

    启动 systemctl start firewalld 停止 systemctl stop firewalld 获取 firewalld 状态 firewall-cmd --state 在不改变状态 ...

  8. 在Linux-PC上建立kdump调试环境

    kdump就是kernel dump的简称,它是从DDR中直接获取的linux内核数据(系统代码/数据).分析kdump是定位内核panic问题的有效手段之一,同时,通过kdump研究内核数据结构,也 ...

  9. 缓存数据库redis

    什么是Redis? Redis是一个TCP服务器,支持请求/响应协议. 在Redis中,请求通过以下步骤完成: 客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应. 服务器处理命 ...

  10. PHP数据结构之一:PHP数据结构基本概念—数据结构

    学习任何一种技术都应该先清楚它的基本概念,这是学习任何知识的起点!本文是讲述数据结构的基本概念,适合对数据结构已经有一定基础的程序员,更是适合想要学习数据结构的code一族!让我们开始PHP数据结构的 ...