国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

淺談正則表達式原理

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

[[270927]]

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

我們先來看看7月初,因為一個正則表達式,導致線上事故的例子。

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

簡單來說就是一個有性能問題的正則表達式,引起了災難性回溯,導致cpu滿載。

性能問題的正則

先看看出問題的正則

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

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

什么是回溯

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

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

回溯現(xiàn)象 

  1. // 性能問題正則  
  2. // 將下面代碼粘貼到瀏覽器控制臺運行試試  
  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í)行耗時:' + (end - start)) 

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

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

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

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

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

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

第三次匹配,因為進行了回溯,所以回到上一個匹配路徑選擇的時候,上次***個 .* 匹配的是 abc ,第二個 .* 匹配的是 d ,并且路不通,所以這里第二次的 .* 不進行匹配,這個時候末尾還有一個 d , \d 和 d 匹配失敗,進行第三次回溯。

如何減少或避免回溯

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

什么是DFA正則引擎

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

DFA

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

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

NFA

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

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

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

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

DFA

正則里面的DFA引擎實際上就是把正則表達式轉換成一個圖的鄰接表,然后通過跳表的形式判斷一個字符串是否匹配該正則。 

  1. // 大概模擬一下  
  2. function machine(input) {  
  3.     if (typeof input !== 'string') {  
  4.         console.log('輸入有誤');  
  5.         return;  
  6.     }  
  7.     // 比如正則:/abc/ 轉換成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)點:不管正則表達式寫的再爛,匹配速度都很快

缺點:高級功能比如捕獲組和斷言都不支持

NFA

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

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

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

總結

現(xiàn)在回到問題的開頭,我們再來看看為什么他的正則會有性能問題

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

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

注意事項

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

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2011-06-16 15:28:31

正則表達式

2018-09-27 15:25:08

正則表達式前端

2020-09-04 09:16:04

Python正則表達式虛擬機

2009-02-17 09:10:01

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

2024-09-14 09:18:14

Python正則表達式

2016-11-10 16:21:22

Java 正則表達式

2022-01-04 11:35:03

Linux Shel正則表達式Linux

2009-09-16 17:15:57

正則表達式引擎

2023-09-13 08:12:45

2010-03-25 18:25:36

Python正則表達式

2021-01-27 11:34:19

Python正則表達式字符串

2022-03-28 06:19:14

正則表達式開發(fā)

2011-06-02 12:34:16

正則表達式

2017-05-12 10:47:45

Linux正則表達式程序基礎

2009-09-16 18:19:34

正則表達式組

2009-02-18 09:48:20

正則表達式Java教程

2009-09-16 10:48:31

PHP正則表達式

2012-04-28 15:22:46

PHP

2009-06-08 16:49:05

Java正則表達式group

2023-10-07 08:25:09

Java處理工具正則表達式
點贊
收藏

51CTO技術棧公眾號

国产一区二区精品在线观看| 国产精品国产三级国产普通话蜜臀| 亚洲三级 欧美三级| 久久久久久久久久久视频| av在线不卡顿| 亚洲av首页在线| 日本欧美在线观看| 91麻豆产精品久久久久久 | 亚洲香蕉网站| 亚洲美女久久久| 青青久在线视频| 国产精品影视在线| av在线不卡观看| 精品国产导航| 亚洲无av在线中文字幕| av在线中文| 一区二区三区四区乱视频| 六月婷婷激情综合| 亚洲私人影院| 国产日本欧美一区| 免费萌白酱国产一区二区三区| 亚洲国产日韩欧美在线99| 蝌蚪视频在线播放| 亚洲成a人片在线观看中文| 久久网站免费视频| 日韩国产欧美在线观看| 国产伦精品一区二区三区视频黑人 | 男女爱爱视频网站| 香蕉久久a毛片| 国产欧美一区二区三区在线| 亚洲三区欧美一区国产二区| 亚洲社区在线观看| 黑人玩欧美人三根一起进| 日本电影亚洲天堂一区| wwww.国产| 久久久久久久国产精品影院| 女人床在线观看| 欧美aaaaaa午夜精品| 蜜桃网站成人| 欧美激情视频一区二区三区在线播放 | 久久久久久成人| 小小水蜜桃在线观看| 免费av手机在线观看| 色综合久久久久综合99| 欧美最顶级a∨艳星| 最新不卡av在线| 青娱乐国产91| 国产盗摄女厕一区二区三区 | 欧美另类在线观看| 亚洲精品一区视频| 91精品在线看| 999精彩视频| 国产亚洲一二三区| 国产 日韩 亚洲 欧美| 国产激情91久久精品导航| 中文字幕制服丝袜在线| 国产精品一区二区在线观看不卡| 中文字幕色呦呦| av一本久道久久综合久久鬼色| 亚洲 欧美 日韩 国产综合 在线 | 第四色婷婷基地| 亚洲国产成人一区二区三区| 国产精品自拍视频在线| 亚洲女同ⅹxx女同tv| jizzjizz亚洲中国少妇| 夜夜爽夜夜爽精品视频| 国产中文在线观看| 日韩免费高清av| 亚洲精品中文字幕| 欧美日韩国产成人在线| 国产日韩欧美一区二区三区| 99三级在线| 免费人成在线不卡| 男人的天堂狠狠干| 亚洲天堂中文字幕| 色的视频在线免费看| 国产视频久久久久| 亚洲国产欧美国产第一区| 国产日产欧美精品| 麻豆精品国产91久久久久久| jizzjizzxxxx| 欧美天堂在线观看| 三妻四妾完整版在线观看电视剧| 九九热精品视频在线播放| 91综合久久| 91麻豆天美传媒在线| 中文字幕佐山爱一区二区免费| 国产色在线 com| 亚洲视频第一页| 国产女主播在线| 亚洲小视频在线| 成人妖精视频yjsp地址| 亚洲国产精品毛片av不卡在线| 欧美日韩精品在线观看| 国产精品丝袜在线播放| 免费在线成人av| 色国产综合视频| 亚洲不卡在线| 成人三级在线| 国产成人免费视频网站| 蜜芽视频在线观看| 精品少妇v888av| 欧美一区=区| 国产cdts系列另类在线观看| 在线成人欧美| 精品中文字幕在线观看| 久久国产精品成人免费观看的软件| 欧美精品七区| 国产精品成人网| 色呦呦呦在线观看| 欧美影院在线播放| 三级精品在线观看| 色老板视频在线观看| 亚洲欧美日韩精品久久奇米色影视| 精品国产乱码久久久久久1区2匹| 国产精品视频一区二区三区| 伦理片一区二区三区| 欧美xxxx18国产| 日韩精品影视| 日本一道在线观看| 亚洲图片欧美视频| 国产一区一一区高清不卡| 国产有码在线一区二区视频| 成人性生交大片免费看中文| 992tv免费直播在线观看| 欧美日韩成人在线播放| 久久成人久久爱| 男女视频在线观看免费| 欧美精品久久久久a| 国产一区二区免费看| 电影在线高清| 国产精品久久久av久久久| 久久九九99视频| 欧美羞羞视频| 欧美一区1区三区3区公司| 好吊妞国产欧美日韩免费观看网站| 欧美日本韩国一区二区| 日韩激情视频一区二区| 亚洲国产精品悠悠久久琪琪| 欧美hdfree性xxxx| 久久中文字幕国产| 美国毛片一区二区三区| 91社区在线高清| 国产精品老女人视频| 亚洲国产精品av| av在线播放一区| 亚洲精品一品区二品区三品区 | 在线看片一区| 91大神影片| 不卡毛片在线看| 国产99久久精品| 最新中文字幕在线播放| 日本一区二区三区视频在线观看| 在线观看成人小视频| 红桃视频在线观看一区二区| 全部孕妇毛片丰满孕妇孕| 欧美极品美女电影一区| 91丨九色丨尤物| 精品一区二区三区亚洲| av女优在线播放| 国产一区二区三区视频| 国产精品中文字幕日韩精品| 天天免费亚洲黑人免费| 女人床在线观看| 精品国产一区二区三区久久狼黑人 | 人人妻人人澡人人爽欧美一区双 | 欧美日韩最好看的视频| 欧美日韩久久不卡| 一本久久综合| 麻豆系列在线观看| 午夜免费电影一区在线观看| 亚洲成人久久久久| 精品一区二区三区影院在线午夜| 在线女人免费视频| 欧美高清中文字幕| 欧美美女18p| 一区二区三区日韩| 欧美日韩1区2区3区| 黄色在线播放网站| 亚洲精品在线观看免费| 亚洲欧美国产视频| 久久嫩草精品久久久精品| 成人国产精品久久| 无码日韩人妻精品久久蜜桃| 国内精品伊人久久| 亚洲成人福利片| 欧美日韩亚洲一区在线观看| 国产三级视频在线| 亚洲一区二区自拍偷拍| 国产一区二区三区日韩欧美| 国产河南妇女毛片精品久久久| 日韩电影精品| 国产男女在线观看| 日韩女优在线播放| 日韩欧美在线中字| 中文在线а√在线| 国产综合欧美在线看| 亚洲国产精品高清久久久| av一区二区三区四区| 亚洲成人精品|