精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

淺談?wù)齽t表達(dá)式原理

開發(fā) 前端
正則表達(dá)式可能大部分人都用過,但是大家在使用的時(shí)候,有沒有想過正則表達(dá)式背后的原理,又或者當(dāng)我告訴你正則表達(dá)式可能存在性能問題導(dǎo)致線上掛掉,你會(huì)不會(huì)覺得特別吃驚?

[[270927]]

正則表達(dá)式可能大部分人都用過,但是大家在使用的時(shí)候,有沒有想過正則表達(dá)式背后的原理,又或者當(dāng)我告訴你正則表達(dá)式可能存在性能問題導(dǎo)致線上掛掉,你會(huì)不會(huì)覺得特別吃驚?

我們先來看看7月初,因?yàn)橐粋€(gè)正則表達(dá)式,導(dǎo)致線上事故的例子。

https://blog.cloudflare.com/d...

簡單來說就是一個(gè)有性能問題的正則表達(dá)式,引起了災(zāi)難性回溯,導(dǎo)致cpu滿載。

性能問題的正則

先看看出問題的正則

引起性能問題的關(guān)鍵部分是 .*(?:.*=.*) ,這里我們先不管那個(gè)非捕獲組,將性能問題的正則看做 .*.*=.* 。

其中 . 表示匹配除了換行以外的任意字符(很多人把這里搞錯(cuò),容易出bug), .* 表示貪婪匹配任意字符任意次。

什么是回溯

在使用貪婪匹配或者惰性匹配或者或匹配進(jìn)入到匹配路徑選擇的時(shí)候,遇到失敗的匹配路徑,嘗試走另外一個(gè)匹配路徑的這種行為,稱作回溯。

可以理解為走迷宮,一條路走到底,發(fā)現(xiàn)無路可走就回到上一個(gè)三岔口選擇另外的路。

回溯現(xiàn)象 

  1. // 性能問題正則  
  2. // 將下面代碼粘貼到瀏覽器控制臺(tái)運(yùn)行試試  
  3. const regexp = `[A-Z]+\\d+(.*):(.*)+[A-Z]+\\d+`;  
  4. const str = `A1:B$1,C$1:D$1,E$1:F$1,G$1:H$1`  
  5. const reg = new RegExp(regexp);  
  6. start = Date.now();  
  7. const res = reg.test(str);  
  8. end = Date.now();  
  9. console.log('常規(guī)正則執(zhí)行耗時(shí):' + (end - start)) 

現(xiàn)在來看看回溯究竟是怎么一回事

假設(shè)我們有一段正則 (.*)+\d ,這個(gè)時(shí)候輸入字符串為 abcd ,注意這個(gè)時(shí)候僅僅輸入了一個(gè)長度為4的字符串,我們來分析一下匹配回溯的過程:

上面展示了一個(gè)回溯的匹配過程,大概描述一下前三輪匹配。

注意 (.*)+ 這里可以先暫且看成多次執(zhí)行 .* 。 (.*){1,}

***次匹配,因?yàn)?.* 可以匹配任意個(gè)字符任意次,那么這里可以選擇匹配空、a、ab、abc、abcd,因?yàn)?* 的貪婪特性,所以 .* 直接匹配了 abcd 4個(gè)字符, + 因?yàn)楹竺鏇]有其他字符了,所以只看著 .* 吃掉 abcd 后就不匹配了,這里記錄 + 的值為1,然后 \d 沒有東西能夠匹配,所以匹配失敗,進(jìn)行***次回溯。

第二次匹配,因?yàn)檫M(jìn)行了回溯,所以回到上一個(gè)匹配路徑選擇的時(shí)候,上次 .* 匹配的是 abcd ,并且路不通,那么這次只能嘗試匹配 abc ,這個(gè)時(shí)候末尾還有一個(gè) d ,那么可以理解為 .* ***次匹配了 abc ,然后因?yàn)?(.*)+ 的原因, .* 可以進(jìn)行第二次匹配,這里 .* 可以匹配 d ,這里記錄 + 的值為2,然后 \d 沒有東西能夠匹配,所以匹配失敗,進(jìn)行第二次回溯。

第三次匹配,因?yàn)檫M(jìn)行了回溯,所以回到上一個(gè)匹配路徑選擇的時(shí)候,上次***個(gè) .* 匹配的是 abc ,第二個(gè) .* 匹配的是 d ,并且路不通,所以這里第二次的 .* 不進(jìn)行匹配,這個(gè)時(shí)候末尾還有一個(gè) d , \d 和 d 匹配失敗,進(jìn)行第三次回溯。

如何減少或避免回溯

  •  優(yōu)化正則表達(dá)式:時(shí)刻注意回溯造成的性能影響。
  •  使用DFA正則引擎的正則表達(dá)式

什么是DFA正則引擎

傳統(tǒng)正則引擎分為NFA(非確定性有限狀態(tài)自動(dòng)機(jī)),和DFA(確定性有限狀態(tài)自動(dòng)機(jī))。

DFA

對(duì)于給定的任意一個(gè)狀態(tài)和輸入字符,DFA只會(huì)轉(zhuǎn)移到一個(gè)確定的狀態(tài)。并且DFA不允許出現(xiàn)沒有輸入字符的狀態(tài)轉(zhuǎn)移。

比如狀態(tài)0,在輸入字符A的時(shí)候,終點(diǎn)只有1個(gè),只能到狀態(tài)1。

NFA

對(duì)于任意一個(gè)狀態(tài)和輸入字符,NFA所能轉(zhuǎn)移的狀態(tài)是一個(gè)非空集合。

比如狀態(tài)0,在輸入字符A的時(shí)候,終點(diǎn)可以是多個(gè),即能到狀態(tài)1,也能到狀態(tài)0。

DFA和NFA的正則引擎的區(qū)別

那么講了這么多之后,DFA和NFA正則引擎究竟有什么區(qū)別呢?或者說DFA和NFA是如何實(shí)現(xiàn)正則引擎的呢?

DFA

正則里面的DFA引擎實(shí)際上就是把正則表達(dá)式轉(zhuǎn)換成一個(gè)圖的鄰接表,然后通過跳表的形式判斷一個(gè)字符串是否匹配該正則。 

  1. // 大概模擬一下  
  2. function machine(input) {  
  3.     if (typeof input !== 'string') {  
  4.         console.log('輸入有誤');  
  5.         return;  
  6.     }  
  7.     // 比如正則:/abc/ 轉(zhuǎn)換成DFA之后  
  8.     // 這里我們定義了4種狀態(tài),分別是0,1,2,3,初始狀態(tài)為0  
  9.     const reg = {  
  10.         0: {  
  11.             a: 1,  
  12.         },  
  13.         1: {  
  14.             b: 3,  
  15.         },  
  16.         2: {  
  17.             isEnd: true,  
  18.         },  
  19.         3: {  
  20.             c: 2,  
  21.         },  
  22.     };  
  23.     let status = 0 
  24.     for (let i = 0; i < input.length; i++) {  
  25.         const inputinputChar = input[i];  
  26.         status = reg[status][inputChar];  
  27.         if (typeof status === 'undefined') {  
  28.             console.log('匹配失敗');  
  29.             return false;  
  30.         }  
  31.     }  
  32.     const end = reg[status];  
  33.     if (end && end.isEnd === true) {  
  34.         console.log('匹配成功');  
  35.         return true;  
  36.     } else {  
  37.         console.log('匹配失敗');  
  38.         return false;  
  39.     }  
  40.  
  41. const input = 'abc' 
  42. machine(input); 

優(yōu)點(diǎn):不管正則表達(dá)式寫的再爛,匹配速度都很快

缺點(diǎn):高級(jí)功能比如捕獲組和斷言都不支持

NFA

正則里面NFA引擎實(shí)際上就是在語法解析的時(shí)候,構(gòu)造出的一個(gè)有向圖。然后通過深搜的方式,去一條路徑一條路徑的遞歸嘗試。

優(yōu)點(diǎn):功能強(qiáng)大,可以拿到匹配的上下文信息,支持各種斷言捕獲組環(huán)視之類的功能

缺點(diǎn):對(duì)開發(fā)正則功底要求較高,需要注意回溯造成的性能問題

總結(jié)

現(xiàn)在回到問題的開頭,我們?cè)賮砜纯礊槭裁此恼齽t會(huì)有性能問題

  1.  首先他的正則使用的NFA的正則引擎(大部分語言的正則引擎都是NFA的,js也是,所以要注意性能問題產(chǎn)生的影響)
  2.  他寫出了有性能問題的正則表達(dá)式,容易造成災(zāi)難性回溯。

如果要避免此類的問題,要么提高開發(fā)對(duì)正則的性能問題的意識(shí),要么改用DFA的正則引擎(速度快,功能弱,沒有補(bǔ)貨組斷言等功能)。

注意事項(xiàng)

在平常寫正則的時(shí)候,少寫模糊匹配,越精確越好,模糊匹配、貪婪匹配、惰性匹配都會(huì)帶來回溯問題,選一個(gè)影響盡可能小的方式就好。寫正則的時(shí)候有一個(gè)性能問題的概念在腦子里就行。

 

責(zé)任編輯:龐桂玉 來源: segmentfault
相關(guān)推薦

2011-06-16 15:28:31

正則表達(dá)式

2018-09-27 15:25:08

正則表達(dá)式前端

2020-09-04 09:16:04

Python正則表達(dá)式虛擬機(jī)

2024-09-14 09:18:14

Python正則表達(dá)式

2009-02-17 09:10:01

正則表達(dá)式Java優(yōu)化

2010-03-25 18:25:36

Python正則表達(dá)式

2011-06-02 12:34:16

正則表達(dá)式

2022-03-28 06:19:14

正則表達(dá)式開發(fā)

2017-05-12 10:47:45

Linux正則表達(dá)式程序基礎(chǔ)

2021-01-27 11:34:19

Python正則表達(dá)式字符串

2009-02-18 09:48:20

正則表達(dá)式Java教程

2009-09-16 18:19:34

正則表達(dá)式組

2022-01-04 11:35:03

Linux Shel正則表達(dá)式Linux

2016-11-10 16:21:22

Java 正則表達(dá)式

2009-09-16 17:15:57

正則表達(dá)式引擎

2023-09-13 08:12:45

2009-09-16 10:48:31

PHP正則表達(dá)式

2012-04-28 15:22:46

PHP

2011-06-16 15:40:28

正則表達(dá)式

2009-08-07 14:24:31

.NET正則表達(dá)式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日本少妇毛茸茸| 国产特级黄色大片| 好吊视频一区二区三区| 国产欧美一级| 亚洲性69xxxbbb| 午夜影院免费观看视频| av手机免费在线观看| 91在线精品一区二区| 奇米影视亚洲狠狠色| 毛片久久久久久| 韩国女主播一区二区三区| 色94色欧美sute亚洲13| 欧美 国产 精品| 日本免费不卡| 国产一区二区在线观看视频| 91福利视频网| 极品久久久久久| 国产精品羞羞答答在线观看| 91精品国产综合久久久久久久| 高清免费日韩| 波多野结衣电车痴汉| 999久久久精品国产| 亚洲成人中文字幕| 激情成人在线观看| yw.尤物在线精品视频| 午夜久久电影网| 影音先锋在线亚洲| 免费av在线电影| 成人综合在线网站| 92看片淫黄大片看国产片| 国产日韩在线免费观看| 99这里有精品| 欧美激情视频在线| xxxx日本少妇| 国产欧美日韩在线一区二区| 亚洲第一精品福利| 精产国品一区二区三区| 成人在线免费av| 色狠狠桃花综合| 久久网站免费视频| 麻豆mv在线看| 精品美女永久免费视频| 玖玖精品在线视频| 大地资源网3页在线观看| 国产精品色一区二区三区| 秋霞毛片久久久久久久久| 日韩在线视频观看免费| 国产suv精品一区二区6| 51国偷自产一区二区三区| 97精品人妻一区二区三区香蕉| 欧美久久影院| 欧美成人精品在线观看| 亚洲精品久久久久久国| 成人精品视频| 中文字幕欧美日韩精品| 亚洲成人网在线播放| 妖精视频一区二区三区| 亚洲美女激情视频| 精品无码在线观看| 欧美亚洲激情| 日韩性xxxx爱| 国产wwwwxxxx| 中文字幕av亚洲精品一部二部| 亚洲国产免费av| 在线观看亚洲免费视频| 老牛国内精品亚洲成av人片| 亚洲国产精品大全| 国产精品探花一区二区在线观看| 91国拍精品国产粉嫩亚洲一区 | 国产三级国产精品| 91精品久久久久久综合五月天 | 国产精品涩涩涩视频网站| 伊人久久在线| 欧美性感一区二区三区| 五月婷婷激情久久| 91麻豆精品| 精品国产伦一区二区三区观看体验| 中文久久久久久| 欧美黑粗硬大| 精品毛片乱码1区2区3区| www.黄色网| 四虎884aa成人精品最新| 亚洲一级一级97网| 人妻少妇精品一区二区三区| 亚洲国产高清一区| 一区二区三区精密机械公司| 日韩视频 中文字幕| 第四色日韩影片| 色婷婷久久综合| www.久久av.com| 成人看片黄a免费看视频| 亚洲男人的天堂在线| 成人做爰视频网站| 夜夜精品视频| 国产欧美一区二区三区久久| 久久97人妻无码一区二区三区| 欧美日韩国产免费观看视频| 久久精品99久久香蕉国产色戒| 亚洲精品中文字幕在线播放| 欧美色图国产精品| 欧美人与性动交| 欧美另类高清videos的特点| 国产激情视频一区二区在线观看 | 2020最新国产精品| 亚洲精品国产精品自产a区红杏吧| 爱情岛论坛亚洲自拍| 色狼人综合干| 免费av在线一区| 乱子伦一区二区三区| 国产精品123区| 亚洲看片网站| 综合毛片免费视频| 欧美精品一区二区三区蜜臀| 一级黄色片网址| 亚洲人体偷拍| 51国产成人精品午夜福中文下载 | 国产福利精品导航| 日本午夜精品电影| xxxcom在线观看| 制服丝袜一区二区三区| 久久亚洲无码视频| 一本色道久久综合一区| 成人动漫视频在线观看免费| 成人精品一区| 欧美视频在线观看免费网址| 国产在线a视频| 天天综合网网欲色| 国产精品午夜视频| 国产乱视频在线观看| 亚洲午夜在线电影| 国产精品二区视频| 亚洲精品久久久| 国产欧美日韩免费| 国产精品无码2021在线观看| 欧美日韩国产丝袜另类| 国产精品久久久久久在线观看| 日韩精品丝袜美腿| 久久久久亚洲精品国产| 国产精品无码AV| 国产精品嫩草99a| 黄色aaa级片| 精品国产91| 国产精品第1页| 国产福利第一视频在线播放| 一本大道av伊人久久综合| 国产人妻人伦精品1国产丝袜| 国产一区二区亚洲| 日韩av色在线| 国产三级在线观看| 在线观看91精品国产入口| 亚洲精品国产91| 日本中文一区二区三区| 天堂精品一区二区三区| 视频在线日韩| 伊人男人综合视频网| 欧美性受xxx黑人xyx性爽| 国产欧美日韩中文久久| 午夜激情在线观看视频| 日韩久久视频| 成人欧美一区二区三区黑人| 成人日批视频| 精品国产乱码久久久久久夜甘婷婷| 男人的天堂官网| 美女诱惑一区二区| 一级黄色录像免费看| 欧美日韩黄网站| 午夜精品久久久久久久久久久久久 | 欧美巨乳在线| 日本乱人伦aⅴ精品| 色欲狠狠躁天天躁无码中文字幕 | 日本wwww视频| 欧美美女视频| 亚洲综合在线中文字幕| a级大胆欧美人体大胆666| 亚洲精品理论电影| 午夜一区二区三区四区| 亚洲精品日韩综合观看成人91| 成人在线观看a| 99tv成人| 国产午夜精品一区| 国产成人精品123区免费视频| 亚洲国产中文字幕久久网| 日干夜干天天干| 国产欧美精品区一区二区三区| 国产一区二区网| 精品日产免费二区日产免费二区| 91精品国产乱码久久久久久久久 | 中文字幕一区二区三区在线乱码| 98色花堂精品视频在线观看| 亚洲人成网7777777国产| 一级片在线免费观看视频| 亚洲图片欧美色图| a级片在线观看| 国产成人在线观看| 99草草国产熟女视频在线| 欧美一区成人| 偷拍视频一区二区| 狠狠久久伊人| 国产一区在线播放| 成人影院大全| 欧美激情在线一区| 日韩在线资源| 日韩精品在线免费| 精品国产伦一区二区三| 日本丶国产丶欧美色综合| 色在线观看视频| 国产欧美一区二区精品忘忧草 | 亚洲石原莉奈一区二区在线观看| 日韩欧美视频在线免费观看| 国产精品素人视频| 菠萝菠萝蜜网站| 国产成人福利片| 污污的视频免费| 久久一区视频| 免费观看国产精品视频| 最新国产精品久久久| 亚洲精品成人三区| 美女视频亚洲色图| 99国产在线视频| 国产精品va视频| 国产精品网站入口| 亚洲精品.com| 欧美一级片免费在线| 国精一区二区三区| 久久99精品久久久久久琪琪 | 99久久夜色精品国产网站| 潘金莲激情呻吟欲求不满视频| 中文字幕一区二区三区乱码图片| 亚洲一区二区自拍| 国产精品伦一区二区| 日韩美女视频中文字幕| 美女高潮在线观看| 97婷婷大伊香蕉精品视频| 黄色在线观看视频网站| 免费av一区二区| 韩国中文字幕在线| 久久好看免费视频| 国产精品va在线观看视色| 神马久久桃色视频| 天堂а√在线官网| 中文字幕av一区二区| www视频在线观看免费| 国产一区二区av| 高清日韩av电影| 一区二区欧美日韩视频| 9191在线| 日韩视频在线免费| 九色porny在线| 久久国产精品影视| 欧美人与动牲性行为| 欧美精品999| 国产传媒在线观看| 青青青国产精品一区二区| 日韩电影av| 国产精品男人爽免费视频1| 欧美国产视频| 99精品国产一区二区| 中文字幕一区二区三区中文字幕| 国产精品免费一区豆花| 日韩毛片免费看| 成人精品一区二区三区电影黑人| 性欧美freesex顶级少妇| 欧美亚洲国产成人精品| 欧美日韩成人影院| 国产自产女人91一区在线观看| 男人的天堂免费在线视频| 欧美一级黑人aaaaaaa做受| 国产一区二区三区影视| 成人黄色短视频在线观看| 欧美日韩午夜电影网| 久久99精品久久久久久水蜜桃| 9999精品免费视频| 国产精品sss| 免费视频一区三区| 成年人免费观看的视频| 国产综合网站| 国产中文字幕免费观看| 奇米影视在线99精品| 欧美专区第二页| 91一区二区三区在线播放| 在线观看免费黄色网址| 一区二区三区四区中文字幕| www.国产com| 56国语精品自产拍在线观看| 神马午夜精品95| 伊人久久精品视频| 91福利在线尤物| 国产精品一区二区久久| 国产精品传媒| 亚洲一区二区三区涩| 亚洲香蕉网站| 国产又粗又长又大的视频| 国产精品 日产精品 欧美精品| 五月天婷婷在线观看视频| 99视频有精品| 国产黄色小视频网站| 亚洲综合免费观看高清完整版在线| 久久视频一区二区三区| 亚洲成人激情自拍| 亚洲一区二区激情| 亚洲精品在线网站| 日本中文字幕在线看| 97视频在线观看播放| www.久久草.com| 欧美三级华人主播| 国产一区日韩一区| 亚洲美女爱爱视频| 久久久一区二区| 国产一级aa大片毛片| 欧美男男青年gay1069videost | 国产主播一区二区| www.超碰97| 亚洲精品国产a久久久久久| 黄色污污视频软件| 日韩精品免费视频| 不卡av免费观看| 亚洲精品日韩激情在线电影| 精品成av人一区二区三区| 欧美精品久久久久久久自慰| 国产一区欧美一区| 永久免费av无码网站性色av| 欧美日韩亚洲成人| 午夜精品在线播放| 久久婷婷国产麻豆91天堂| 成人在线黄色| 欧美日韩一区在线视频| 日韩视频一区二区三区在线播放免费观看| 久草视频国产在线| 国产专区欧美精品| 粉嫩精品久久99综合一区| 欧美色视频日本高清在线观看| 中文无码av一区二区三区| 亚洲乱码一区二区| 性欧美xxx69hd高清| 久久久精品国产一区二区三区| 精品国产一区二区三区噜噜噜 | 欧美日韩久久久一区| 激情小说 在线视频| 欧美自拍大量在线观看| 精品按摩偷拍| 缅甸午夜性猛交xxxx| 成人禁用看黄a在线| 免费又黄又爽又色的视频| 欧美一区二区三区四区在线观看| 无码国产伦一区二区三区视频 | 亚洲精品一区二区三区福利| 在线中文字幕电影| 999日本视频| 欧美日韩综合| 亚洲美女在线播放| 激情懂色av一区av二区av| 午夜在线视频观看| 日韩免费观看在线观看| 精品视频99| 国产精品一区二区小说| 一色桃子久久精品亚洲| 99精品人妻无码专区在线视频区| 日韩成人中文电影| 久久精品女人天堂av免费观看| 91福利视频导航| 欧美91福利在线观看| 日本天堂在线播放| 亚洲成人中文在线| 偷拍自拍在线视频| 26uuu亚洲国产精品| 精品国产乱码久久久| 一区二区在线免费看| 亚洲国产日韩精品| 你懂的在线观看| 国产有码在线一区二区视频| 国产综合自拍| 日本一级免费视频| 在线不卡a资源高清| 青草在线视频| 久久亚洲高清| 精品一区二区精品| 日本熟妇毛茸茸丰满| 亚洲视频在线免费观看| 在线日韩三级| 日日摸日日碰夜夜爽无码| 国产蜜臀97一区二区三区| 国产三级午夜理伦三级| 668精品在线视频| 91日韩视频| 97香蕉碰碰人妻国产欧美| 欧美日韩国产首页| av在线中出| 在线观看一区二区三区三州 | 国产精品久久久久久久久免费| 草草视频在线一区二区| 男人靠女人免费视频网站| 国产精品久久福利| 手机在线精品视频| 成人网址在线观看| 久久九九电影| 免费在线观看av网址| 中文字幕精品av| 麻豆一区二区| 中文字幕avav| 欧洲亚洲国产日韩|