看淘网-高情商聊天恋爱宝典!| 下载蜜小助-恋爱聊天话术

当前位置: 首页> 文章

思念爱人的诗句 伤感

发布时间:2019-08-07 17:44:15 作者:xhs 阅读:852
思念爱人的诗句 伤感:('\n\n\n\n\n藏在正则表达式里的陷阱,一个正则表达式导致CPU 利用率居高不下\n\n前几天线上一个项目监控信息突然报告异常,上到机器上后查看相关资源的使用情况,发现 CPU 利用率将近 100%。通过 Java 自带的线程 Dump 工具,我们导出了出问题的堆栈信息。\n\n\n\n\n\n藏在正则表达式里的陷阱,一个正则表达式导致CPU 利用率居高不下\n\n我们可以看到所有的堆栈都指向了一个名为 validateUrl 的方法,这样的报错信息在堆栈中一共超过 100 处。通过排查代码,我们知道这个方法的主要功能是校验 URL 是否合法。\n很奇怪,一个正则表达式怎么会导致 CPU 利用率居高不下。为了弄清楚复现问题,我们将其中的关键代码摘抄出来,做了个简单的单元测试。\npublic static void main(String[] args) {\n String badRegex = "^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\\\/])+$";\n String bugUrl = "http://www.fapiao.com/dddp-web/pdf/download?request=6e7JGxxxxx4ILd-kExxxxxxxqJ4-CHLmqVnenXC692m74H38sdfdsazxcUmfcOH2fAfY1Vw__%5EDadIfJgiEf";\n if (bugUrl.matches(badRegex)) {\n System.out.println("match!!");\n } else {\n System.out.println("no match!!");\n }\n}\n\n当我们运行上面这个例子的时候,通过资源监视器可以看到有一个名为 Java 的进程 CPU 利用率直接飙升到了 91.4% 。\n\n\n\n\n\n藏在正则表达式里的陷阱,一个正则表达式导致CPU 利用率居高不下\n\n看到这里,我们基本可以推断,这个正则表达式就是导致 CPU 利用率居高不下的凶手!\n于是,我们将排错的重点放在了那个正则表达式上:\n^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\/])+$\n\n这个正则表达式看起来没什么问题,可以分为三个部分:\n第一部分匹配 http 和 https 协议,第二部分匹配 www. 字符,第三部分匹配许多字符。我看着这个表达式发呆了许久,也没发现没有什么大的问题。\n其实这里导致 CPU 使用率高的关键原因就是:Java 正则表达式使用的引擎实现是 NFA 自动机,这种正则表达式引擎在进行字符匹配时会发生回溯(backtracking)。而一旦发生回溯,那其消耗的时间就会变得很长,有可能是几分钟,也有可能是几个小时,时间长短取决于回溯的次数和复杂度。\n看到这里,可能大家还不是很清楚什么是回溯,还有点懵。没关系,我们一点点从正则表达式的原理开始讲起\n正则表达式引擎\n正则表达式是一个很方便的匹配符号,但要实现这么复杂,功能如此强大的匹配语法,就必须要有一套算法来实现,而实现这套算法的东西就叫做正则表达式引擎。简单地说,实现正则表达式引擎的有两种方式:DFA 自动机(Deterministic Final Automata 确定型有穷自动机)和 NFA 自动机(Non deterministic Finite Automaton 不确定型有穷自动机)。\n对于这两种自动机,他们有各自的区别,这里并不打算深入将它们的原理。简单地说,DFA 自动机的时间复杂度是线性的,更加稳定,但是功能有限。而 NFA 的时间复杂度比较不稳定,有时候很好,有时候不怎么好,好不好取决于你写的正则表达式。但是胜在 NFA 的功能更加强大,所以包括 Java 、.NET、Perl、Python、Ruby、PHP 等语言都使用了 NFA 去实现其正则表达式。\n那 NFA 自动机到底是怎么进行匹配的呢?我们以下面的字符和表达式来举例说明。\ntext="Today is a nice day."\nregex="day"\n\n要记住一个很重要的点,即:NFA 是以正则表达式为基准去匹配的。也就是说,NFA 自动机会读取正则表达式的一个一个字符,然后拿去和目标字符串匹配,匹配成功就换正则表达式的下一个字符,否则继续和目标字符串的下一个字符比较。或许你们听不太懂,没事,接下来我们以上面的例子一步步解析。\n\n首先,拿到正则表达式的第一个匹配符:d。于是那去和字符串的字符进行比较,字符串的第一个字符是 T,不匹配,换下一个。第二个是 o,也不匹配,再换下一个。第三个是 d,匹配了,那么就读取正则表达式的第二个字符:a。\n读取到正则表达式的第二个匹配符:a。那着继续和字符串的第四个字符 a 比较,又匹配了。那么接着读取正则表达式的第三个字符:y。\n读取到正则表达式的第三个匹配符:y。那着继续和字符串的第五个字符 y 比较,又匹配了。尝试读取正则表达式的下一个字符,发现没有了,那么匹配结束。\n\n上面这个匹配过程就是 NFA 自动机的匹配过程,但实际上的匹配过程会比这个复杂非常多,但其原理是不变的。\nNFA自动机的回溯\n了解了 NFA 是如何进行字符串匹配的,接下来我们就可以讲讲这篇文章的重点了:回溯。为了更好地解释回溯,我们同样以下面的例子来讲解。\ntext="abbc"\nregex="ab{1,3}c"\n\n上面的这个例子的目的比较简单,匹配以 a 开头,以 c 结尾,中间有 1-3 个 b 字符的字符串。NFA 对其解析的过程是这样子的:\n\n首先,读取正则表达式第一个匹配符 a 和 字符串第一个字符 a 比较,匹配了。于是读取正则表达式第二个字符。\n读取正则表达式第二个匹配符 b{1,3} 和字符串的第二个字符 b 比较,匹配了。但因为 b{1,3} 表示 1-3 个 b 字符串,以及 NFA 自动机的贪婪特性(也就是说要尽可能多地匹配),所以此时并不会再去读取下一个正则表达式的匹配符,而是依旧使用 b{1,3} 和字符串的第三个字符 b 比较,发现还是匹配。于是继续使用 b{1,3} 和字符串的第四个字符 c 比较,发现不匹配了。此时就会发生回溯。\n发生回溯是怎么操作呢?发生回溯后,我们已经读取的字符串第四个字符 c 将被吐出去,指针回到第三个字', '74e167512d1f7fe9', 'n1Mcos2xDm4b8Sfkg39XGhU4ZQ8Iu7KX', 3, '符串的位置。之后,程序读取正则表达式的下一个操作符 c,读取当前指针的下一个字符 c 进行对比,发现匹配。于是读取下一个操作符,但这里已经结束了。\n\n下面我们回过头来看看前面的那个校验 URL 的正则表达式:\n^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\/])+$\n\n出现问题的 URL 是:\nhttp://www.fapiao.com/dzfp-web/pdf/download?request=6e7JGm38jfjghVrv4ILd-kEn64HcUX4qL4a4qJ4-CHLmqVnenXC692m74H5oxkjgdsYazxcUmfcOH2fAfY1Vw__%5EDadIfJgiEf\n\n我们把这个正则表达式分为三个部分:\n\n第一部分:校验协议。^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)。\n第二部分:校验域名。(([A-Za-z0-9-~]+).)+。\n第三部分:校验参数。([A-Za-z0-9-~/])+$。\n\n我们可以发现正则表达式校验协议 http:// 这部分是没有问题的,但是在校验 HYPERLINK www.fapiao.com 的时候,其使用了 xxxx. 这种方式去校验。那么其实匹配过程是这样的:\n\n匹配到 www.\n匹配到 fapiao.\n匹配到 com/dzfp-web/pdf/download?request=6e7JGm38jf.....,你会发现因为贪婪匹配的原因,所以程序会一直读后面的字符串进行匹配,最后发现没有点号,于是就一个个字符回溯回去了。\n\n这是这个正则表达式存在的第一个问题。\n另外一个问题是在正则表达式的第三部分,我们发现出现问题的 URL 是有下划线(_)和百分号(%)的,但是对应第三部分的正则表达式里面却没有。这样就会导致前面匹配了一长串的字符之后,发现不匹配,最后回溯回去。\n这是这个正则表达式存在的第二个问题。\n解决方案\n明白了回溯是导致问题的原因之后,其实就是减少这种回溯,你会发现如果我在第三部分加上下划线和百分号之后,程序就正常了。\npublic static void main(String[] args) {\n String badRegex = "^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~_%\\\\/])+$";\n String bugUrl = "http://www.fapiao.com/dddp-web/pdf/download?request=6e7JGxxxxx4ILd-kExxxxxxxqJ4-CHLmqVnenXC692m74H38sdfdsazxcUmfcOH2fAfY1Vw__%5EDadIfJgiEf";\n if (bugUrl.matches(badRegex)) {\n System.out.println("match!!");\n } else {\n System.out.println("no match!!");\n }\n}\n\n运行上面的程序,立刻就会打印出match!!。\n但这是不够的,如果以后还有其他 URL 包含了乱七八糟的字符呢,我们难不成还再修改一遍。肯定不现实嘛!\n其实在正则表达式中有这么三种模式:贪婪模式、懒惰模式、独占模式。\n在关于数量的匹配中,有 + ? * {min,max} 四种两次,如果只是单独使用,那么它们就是贪婪模式。\n如果在他们之后加多一个 ? 符号,那么原先的贪婪模式就会变成懒惰模式,即尽可能少地匹配。但是懒惰模式还是会发生回溯现象的。例如下面这个例子:\ntext="abbc"\nregex="ab{1,3}?c"\n\n正则表达式的第一个操作符 a 与 字符串第一个字符 a 匹配,匹配成功。于是正则表达式的第二个操作符 b{1,3}? 和 字符串第二个字符 b 匹配,匹配成功。因为最小匹配原则,所以拿正则表达式第三个操作符 c 与字符串第三个字符 b 匹配,发现不匹配。于是回溯回去,拿正则表达式第二个操作符 b{1,3}? 和字符串第三个字符 b 匹配,匹配成功。于是再拿正则表达式第三个操作符 c 与字符串第四个字符 c 匹配,匹配成功。于是结束。\n如果在他们之后加多一个 + 符号,那么原先的贪婪模式就会变成独占模式,即尽可能多地匹配,但是不回溯。\n于是乎,如果要彻底解决问题,就要在保证功能的同时确保不发生回溯。我将上面校验 URL 的正则表达式的第二部分后面加多了个 + 号,即变成这样:\n^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)\n(([A-Za-z0-9-~]+).)++ --->>> (这里加了个+号)\n([A-Za-思念爱人的诗句 伤感
相关文章
猜您喜欢
怎么试探前女友想不想复合?

女人是一种让男人捉摸不透的生物,特别是在分手后,就算有复合的想法,表面也会表现的很平静。所以需要男人根据情况自己判断。那到底该怎么去试探前女友想不想复合呢?

2024-02-21

狮子座女生的10个特点,追她之前摸透她的心

狮子座女生可不是那么好追的女生,看上去她平易近人、热情开朗,其实内心却有着自己的小傲娇,狮子座女生的10个特点,追她之前先了解一下吧!

2024-02-21

大街上怎么要女生微信不尴尬,这样要女生乖乖给你

很多时候男生就算在大街上遇到自己喜欢的女生类型,也不敢上来问女生微信,只能看着自己心仪的女生慢慢走远。下面给大家分享大街上怎么要女生微信不尴尬,这样要女生乖乖给你。

2024-02-20

用一个问题测试她喜欢你的方法,女生喜欢你就去追

想知道女生是不是喜欢你,教用一个问题测试她喜欢你的方法:你可以对她说一句话:你好像长胖了一点?(看看女生是什么反应。不过如果男生问出这个问题,可能让女生觉得你情商低,就算女生喜欢你也有一定的风险性)

2024-02-20

女生说心累怎么回复安慰她?分享正确回复方法

女生会在什么情况下说心累呢?可能是她工作上面遇到问题不好解决,让她觉得心累;可能是你对于女生的暗示无动于衷,女生觉得你不落教感到心累。那女生说心累应该怎么回复安慰她呢?

2024-02-19

惹女朋友生气检讨书1000字,哄她不再生你的气

如果男生犯了错惹女朋友生气,那就一定要想办法哄好她,因为是你错了呀。而想要哄好生气的女朋友,那你一定要认识到自己的错误,下面给大家分享惹女朋友生气检讨书1000字,希望能够帮助你哄好你的女朋友。

2024-02-19

婚姻恢复——维持感情让家庭重归平静

婚姻中有幸福的时候,也有不幸福的时候,夫妻应该做到维持好感情,才能顺利让婚姻恢复到幸福的时候,让家庭重归平静。

2024-02-19

怎么追巨蟹座女生?追巨蟹座女生怎么聊天

和巨蟹座女生谈过恋爱之后,就会知道她的内心真的很纯真,不过她性格上的复杂性则是让许多男生疑惑的关键,怎么追巨蟹座女生?追巨蟹座女生的时候要如何聊天呢?

2024-02-18

女朋友说分手后做朋友是什么意思?是真的做朋友么

如果女朋友说分手后做朋友是什么意思呢?如果是还爱着对方那就不应该选择分手,如果是不爱了那大家就应该彻底断了联系,真正深爱过的人是不可能在分手后做朋友的。下面就来分析女朋友的心理。

2024-02-18

暗恋一个人能有多难受?虐心回答句句戳心

暗恋是幸福的,却又是痛苦的,更是难受的,可遇而不可求的爱始终会令人感到绝望,那就是暗恋一个人所体会的难受,明明没有机会却又不想放手真的很痛苦。

2024-02-18

脱单神器
脱单神器
安卓版蜜小助APP 脱单神器
iOS版蜜小助APP 脱单神器

20W+可复制撩妹话术

实战案例+话术+视频+教程

热门文章
口述:公公在梳妆台上给我数次高潮
口述:公公在梳妆台上给我数次高潮
2013-11-11 1069065
二宮琴美、東熱出操翻白眼昏死
二宮琴美、東熱出操翻白眼昏死
2015-03-14 78328
那个午夜 禽兽继父将我压在身下
那个午夜 禽兽继父将我压在身下
2014-04-08 78054
韩国美女主播”钟淑”高清视频精品合集9部 115网盘在线观看
韩国美女主播”钟淑”高清视频精品合集9部 115网盘在线观看
2015-03-11 77288
店长推荐作品 EMP-001 EMPIRE Vol.1 50 波多野结衣 50连发泼溅中 2012年
店长推荐作品 EMP-001 EMPIRE Vol.1 50 波多野结衣 50连发泼溅中 2012年
2015-03-19 75774
留守女人和禽兽公公的不伦性事
留守女人和禽兽公公的不伦性事
2013-12-28 74937
美国男人让我一夜高潮五次
美国男人让我一夜高潮五次
2014-04-29 69845
关牧村与前夫王星军离婚真正原因 关牧村前夫王星军照片家庭背景及个人资料
关牧村与前夫王星军离婚真正原因 关牧村前夫王星军照片家庭背景及个人资料
2014-08-15 64941
公公的精湛床技让我死去活来
公公的精湛床技让我死去活来
2014-04-08 56763
我和小姨子在车上疯狂嘿咻
我和小姨子在车上疯狂嘿咻
2013-12-28 56566