精品欧美一区二区三区在线观看 _久久久久国色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)

亚洲高清视频免费观看| 亚洲成人网在线播放| 国产在线更新| 成人午夜又粗又硬又大| 欧美在线观看网站| 国产精品酒店视频| 综合伊人久久| 91久久线看在观草草青青| 在线免费观看成人网| 欧性猛交ⅹxxx乱大交| 视频一区欧美精品| 欧美噜噜久久久xxx| 亚洲a v网站| 日韩一级淫片| 欧美羞羞免费网站| 福利视频一二区| 日本综合在线| 久久久久国产一区二区三区四区 | 男人的天堂一区二区| 欧美一区二区性| 亚洲国产精品人久久电影| 91制片厂毛片| 亚洲欧洲高清| 亚洲一区在线观看视频| 永久久久久久| 黄色av网址在线免费观看| 国产·精品毛片| 成人高h视频在线| 黄色网址中文字幕| 日韩亚洲在线| 欧美极品美女电影一区| 亚洲综合图片一区| 欧美日韩高清| 亚洲人成网站777色婷婷| 久久无码专区国产精品s| 亚洲三级在线| 欧美日韩在线精品一区二区三区激情| 老太脱裤子让老头玩xxxxx| 国产精品刘玥久久一区| 国产精品美女久久久久久久久久久| 久久综合入口| 少妇一区二区三区四区| 精品一区二区三区免费| 国产精品丝袜高跟| 黄色av一区二区| 免费日韩视频| 日本久久亚洲电影| 精品国产一区二区三区四| 99视频精品| 午夜精品久久久久久久99黑人 | 精品影院一区| 久久精品夜色噜噜亚洲aⅴ| 国产日韩欧美亚洲一区| 日本人妻熟妇久久久久久| 国产盗摄一区二区三区| 99超碰麻豆| 亚洲国产综合一区| 成人做爰69片免费看网站| 国产高清一区视频| 欧美特黄一级视频| 成人免费观看av| 精品亚洲欧美日韩| 清纯唯美亚洲色图| 国产亚洲精品aa午夜观看| 久久免费精品| 成人黄色在线视频| 国产高清精品一区二区三区| 国产成人三级在线观看视频| 成人av电影在线| 久久精品国产第一区二区三区最新章节 | 亚洲国产综合网| 播五月开心婷婷综合| 精品国产一区二区三区四区精华| 亚洲AV第二区国产精品| 久久精品视频在线免费观看| 日韩妆和欧美的一区二区| 91精品国产91久久久久游泳池| 18成人在线观看| 中文字幕人妻熟女人妻洋洋| 久久香蕉av| 一本色道久久综合狠狠躁的推荐 | 高清av一区| 67194成人在线观看| 极品人妻一区二区| 婷婷五月色综合香五月| 中文在线不卡视频| 欧美色图一区二区| 在线一区免费观看| 国产在线视频2019最新视频| 亚洲av无码乱码在线观看性色| 99热99精品| 亚洲欧洲精品一区二区三区波多野1战4| 免费的黄网站在线观看| 亚洲成av人在线观看| 99草草国产熟女视频在线| 国产精品一级在线观看| 亚洲美女黄色片| 国产中文字幕久久| 亚洲国产二区| 成人黄色影片在线| 天堂91在线| 亚洲人成在线播放网站岛国 | 久热这里只有精品在线| 老牛国产精品一区的观看方式 | 亚洲美女15p| 久久精品99久久久久久久久| 女人十八岁毛片| 国产一区二区三区不卡在线观看| 免费在线观看91| 亚洲欧美成人影院| 欧美性生交片4| 日韩成人av一区二区| 午夜av一区| 国产精品老牛影院在线观看| 天天干在线观看| 亚洲人精品午夜| 亚洲一级免费观看| 最新亚洲精品| 午夜精品福利电影| 亚洲爱爱综合网| 亚洲三级电影全部在线观看高清| 免费一级特黄录像| 亚洲三级网页| 91福利视频在线观看| www.成人精品| 亚洲丝袜精品丝袜在线| 999精品视频在线| 午夜先锋成人动漫在线| 久久久久久欧美| 国产男女猛烈无遮挡| 国产精品久久精品日日| 91香蕉视频污版| 国产一区二区观看| 欧美亚洲第一页| 天堂中文在线看| 亚洲国产精品久久不卡毛片 | 久久香蕉精品香蕉| 欧美成人免费va影院高清| 在线观看国产小视频| 国产欧美一区在线| 哪个网站能看毛片| 亚洲区小说区| 日本久久精品视频| 黄色小视频在线免费观看| 日韩欧美一区二区三区| 亚洲国产欧美视频| 久久精品男女| 日本午夜精品一区二区| 日韩欧美一区二区三区在线观看 | 欧美在线日韩精品| 在线成人av观看| 亚洲色图35p| 国产成人麻豆免费观看| 欧美国产一区视频在线观看| 91热这里只有精品| 国产精品99视频| 亚洲一区久久久| 成人性生交大片免费看网站| 亚洲成人av中文字幕| 中日韩黄色大片| 国产蜜臀av在线一区二区三区| 亚洲最大成人在线观看| 婷婷综合在线| 国产精品久久久久久久免费大片| 黄网av在线| 亚洲美女性生活视频| 男人天堂视频网| 亚洲欧洲精品一区二区精品久久久 | 日本一本草久p| 99这里只有精品视频| 91av在线免费观看| а√天堂中文在线资源bt在线| 欧美精品视频www在线观看| 人妻久久一区二区| eeuss影院一区二区三区| 国产精品亚洲二区在线观看| 欧美国产美女| 成人区精品一区二区| 在线看片福利| www.久久久久| 人妻少妇精品无码专区久久| 日韩人在线观看| 精品国产精品国产精品| 国产成人小视频| 激情综合网俺也去| 88国产精品视频一区二区三区| 国产精品区一区二区三在线播放| 欧美大片免费观看网址| 麻豆成人在线看| 欧美少妇另类| 日韩欧美精品在线| 加勒比在线一区| 一区二区三区欧美久久| 亚洲AV无码片久久精品| 国产一区二区三区高清播放| 噜噜噜久久亚洲精品国产品麻豆 | 久久这里有精品| 日韩精品视频无播放器在线看| 欧美人xxxx| 精品国产一区二区三区四| 亚洲激情网站免费观看| 色噜噜日韩精品欧美一区二区| 国产一区二区三区观看| 国产视频在线视频| 99riav国产精品| 男女爱爱视频网站| 欧美日韩国产免费观看视频| 国产精品一区二区三区不卡| 久久亚洲国产精品尤物| 57pao国产成人免费| 影音先锋男人资源在线| 色悠悠久久久久| 天堂在线观看av| 欧美电影免费提供在线观看| 中文字幕 国产| 欧美天天综合色影久久精品| 久久综合成人网| 亚洲人亚洲人成电影网站色| 日本污视频网站| 91欧美一区二区| 成人欧美精品一区二区| 激情深爱一区二区| 超碰在线公开97| 日韩精品福利网| 国产免费一区二区三区视频| 国产精品99一区二区| 中文字幕一区二区三区四区五区六区| 国产精品嫩模av在线| 精品伦理一区二区三区| 成人性生交大片免费看中文视频| 92裸体在线视频网站| 天天综合91| 国产日韩欧美另类| 成人全视频在线观看在线播放高清| 51色欧美片视频在线观看| 国产三级伦理在线| 欧美激情手机在线视频| 91在线中文| 美女少妇精品视频| 成人在线app| 欧美成人高清视频| 日韩另类在线| 久久噜噜噜精品国产亚洲综合| 青春草视频在线观看| 欧美大片在线看| 欧美wwww| 性色av一区二区三区免费| 8x8ⅹ拨牐拨牐拨牐在线观看| 久久久久这里只有精品| а√在线中文在线新版| 91av视频在线| 羞羞影院欧美| 国产精品羞羞答答| 4438五月综合| **亚洲第一综合导航网站| 经典三级久久| 国产欧美日韩一区| 欧美理伦片在线播放| 欧美精品与人动性物交免费看| 竹菊久久久久久久| 亚洲精品乱码久久久久久蜜桃91 | 日韩视频免费看| 搞黄网站在线观看| 欧美极品少妇xxxxⅹ喷水| 24小时免费看片在线观看| 51精品在线观看| 成人国产激情| 91久久伊人青青碰碰婷婷| 大奶在线精品| 欧美一区二区三区四区夜夜大片 | 成人爽a毛片一区二区| 亚洲激情小视频| 国产福利在线观看| 超在线视频97| 一个人www视频在线免费观看| 国产精品久久av| 亚洲一二av| 蜜桃免费一区二区三区| 天天精品视频| 精品久久久久久久久久中文字幕| 久久婷婷亚洲| 国产资源中文字幕| 26uuu成人网一区二区三区| 欧美人与禽zoz0善交| 亚洲黄色尤物视频| www.久久精品视频| 91精品福利在线一区二区三区 | 亚洲日本一区二区三区在线| 久久av一区二区| 午夜精品一区二区三区国产| 黄色大片中文字幕| 丝袜亚洲精品中文字幕一区| 中文字幕在线视频一区二区| 91蜜桃传媒精品久久久一区二区| 亚洲区一区二区三| 欧美日韩在线免费观看| 最近中文字幕免费在线观看| 欧美成人女星排行榜| 成人精品福利| 97国产精品人人爽人人做| crdy在线观看欧美| 欧洲久久久久久| 亚洲国产裸拍裸体视频在线观看乱了中文| 免费在线观看毛片网站| 国产99久久久久| 久久久久久成人网| 欧美日韩精品在线观看| 国产女人18毛片18精品| 亚洲社区在线观看| 51精品视频| 91在线视频九色| 不卡av一区二区| 各处沟厕大尺度偷拍女厕嘘嘘| 国产在线精品不卡| 少妇一级黄色片| 欧美日韩亚洲视频一区| 亚洲AV无码精品色毛片浪潮| 久久中文字幕一区| 黄色日韩网站| 亚洲国产一区二区三区在线| 亚洲制服av| 国产黄色三级网站| 亚洲综合男人的天堂| 国产免费av观看| 最新日韩中文字幕| 中国字幕a在线看韩国电影| 国产精品18毛片一区二区| 自拍偷拍欧美专区| 热久久久久久久久| 国产精品免费人成网站| 日韩精品在线一区二区三区| 亚洲视频在线观看免费| 在线免费看h| 欧美极品色图| 午夜在线一区二区| 国产伦精品一区二区三区妓女| 亚洲一本大道在线| 国产1区在线观看| 欧美激情中文网| 精品女人视频| 国产91在线视频观看| 99国产精品久久| 狠狠人妻久久久久久综合| 亚洲精品日韩久久久| 中文不卡1区2区3区| 久久久久久久久久久久久久一区| 亚洲乱亚洲高清| av在线网站观看| 色悠悠久久综合| 超碰免费在线观看| 国产日韩欧美在线看| 欧美wwwww| 精品人妻一区二区三区免费| 一区二区三区日韩在线观看| 成人毛片在线精品国产| 57pao国产精品一区| 波多野结衣在线观看一区二区三区| 久久久久国产一区| 中文字幕日韩欧美一区二区三区| 99国产在线播放| 久久久久久18| 一区三区在线欧| 超碰在线播放91| 亚洲精品国产一区二区精华液| 亚洲黄色片视频| 欧美一级成年大片在线观看 | 99久久久国产精品| 色屁屁影院www国产高清麻豆| 有码中文亚洲精品| 成年永久一区二区三区免费视频| 国产91porn| 97se亚洲国产综合自在线观| 一本一道无码中文字幕精品热| 伊人av综合网| 青草伊人久久| 日日橹狠狠爱欧美超碰| 国产欧美精品一区二区三区四区 | 国产亚洲精品va在线观看| 色婷婷成人网| 日韩免费视频播放| 国产清纯在线一区二区www| 国产精品视频一区二区三区,| 国内精品美女av在线播放| 国产欧美亚洲精品a| 色哟哟免费视频| 欧美性xxxxxxx| 国产在线观看a视频| 麻豆传媒一区二区| 国产美女精品在线| 精品国产xxx| 欧美精品一区三区| 国产一区二区三区四区五区| 91性高潮久久久久久久| 都市激情亚洲色图| a在线免费观看| 日韩国产在线一区| 成人av中文字幕| 国产精品国产一区二区三区四区| 91国产视频在线| 午夜国产欧美理论在线播放 |