正则表达式回溯-导致CPU偏高
最近了解了下有关正则表达式回溯的内容,想想就写下来,方便自己。
正则表达式匹配算法是建立在正则表达式引擎的基础上的,目前有两种引擎: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偏高的更多相关文章
- 正则表达式回溯导致的CPU打满
参考: https://my.oschina.net/ttscjr/blog/2208526 https://mp.weixin.qq.com/s?__biz=MzA4MjIyNTY0MQ==& ...
- 记一次查内存异常问题(续《记一次Web应用CPU偏高》)
继上一次查应用的CPU飙高问题(http://www.cnblogs.com/hzmark/p/JVM_CPU.html)过去10天了.上次只是定位到了是一个第三方包占用了大量的CPU使用,但没有细致 ...
- 记一次Web应用CPU偏高
LZ开发的一个公司内部应用供查询HIVE数据使用.部署上线后总是会出现CPU偏高的情况,而且本地测试很难重现.之前出现几次都是通过直接重启后继续使用,因为是内部使用,重启一下也没有很大影响(当然,每次 ...
- 一次FGC导致CPU飙高的排查过程
今天测试团队反馈说,服务A的响应很慢,我在想,测试环境也会慢?于是我自己用postman请求了一下接口,真的很慢,竟然要2s左右,正常就50ms左右的. 于是去测试服务器看了一下,发现服务器负载很高, ...
- 记一次yarn导致cpu飙高的异常排查经历
yarn就先不介绍了,这次排坑经历还是有收获的,从日志到堆栈信息再到源码,很有意思,下面听我说 问题描述: 集群一台NodeManager的cpu负载飙高. 进程还在但是看日志已经不再向Resourc ...
- C#正则表达式引发的CPU跑高问题以及解决方法
3月23日(周日)下午16:30左右,博客园主站负载均衡中的2台Web服务器CPU玩起了爬楼梯的游戏(见上图),一直爬到了接近100%.发现这个状况后,我们立即将这2台阿里云临时磁盘云服务器从负载均衡 ...
- java 快速定位线上cpu偏高
1.top -c 加 大写P 查找高进程ID 2.top -Hp 加 大写 P 查找高线程ID 3.printf '%x\n' 线程ID 转成16进制 4.jstack 进程ID | grep 16进 ...
- 查询执行成本高(查询访问表数据行数多)而导致实例 CPU 使用率高是 MySQL 非常常见的问题
MySQL CPU 使用率高的原因和解决方法_产品性能_常见问题_云数据库 RDS 版-阿里云 https://help.aliyun.com/knowledge_detail/51587.html ...
- Visual Studio 2012安装VASSISTX插件后导致CPU高的解决的方法
笔者一直都喜欢用VAX插件来做C++的开发,但发现VS2012安装了VAX后,CPU占用超级高,有时界面卡死得很厉害.我卸了又装,升级最新版,都无论用. 直到有天.看到网友说:VS2012的sdf文件 ...
随机推荐
- spring data mongodb 操作
xml配置(mongo集群方式): <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=& ...
- PCB上 如何显示 汉字
原理图上有汉字,那如何在PCB上显示汉子呢 ? 而不至于显示乱码 按如下操作 ,双击乱码 ,进入设置模式 设置好后,显示的字体样式.
- 给安卓端调用的apk、图片下载接口
package com.js.ai.modules.pointwall.action; import java.io.File; import java.io.FileInputStream; imp ...
- springboot成神之——发送邮件
本文介绍如何用spring发送邮件 目录结构 依赖 MailConfig TestController 测试 本文介绍如何用spring发送邮件 目录结构 依赖 <dependency> ...
- IAR FOR ARM 各版…
用过Keil和IAR,个人感觉是IAR还是很不错的.下载地址是: http://files.iar.com/ftp/pub/box/CD-EWARM-6301-3142.zip V6.30.1(该地址 ...
- 数据库与vs的连接
新建一个MFC基于对话框的项目后,更改属性, 其中需要将include(里面都是MySQL的头文件)lib是库文件,将.dll放入与.exe同级目录下,或放入系统里(c:\windows\system ...
- Android适配器Adapter的学习
Android中有很多的适配器,首先看看这些适配器的继承结构 这些适配器中,BaseAdapter用的最多,也用的最熟,先放过他,从ArrayAdapter开始 一个listAdapter用来管理一个 ...
- 自定义type
- 2018 Spring Single Training B (uva 572,HihoCoder 1632,POJ 2387,POJ 2236,UVA 10054,HDU 2141)
这场比赛可以说是灰常的水了,涨信心场?? 今下午义务劳动,去拿着锄头发了将近一小时呆,发现自己实在是干不了什么,就跑到实验室打比赛了~ 之前的比赛补题补了这么久连一场完整的都没补完,结果这场比完后一小 ...
- 【bzoj1083】[SCOI2005]繁忙的都市
1083: [SCOI2005]繁忙的都市 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2424 Solved: 1591[Submit][Sta ...