昨天在《js正則學習小記之匹配字符串字面量》談到/"(?:\\.|[^"])*"/是個不錯的表達式,因為可以滿足我們的要求,所以這個表達式可用,但不一定是很好的
昨天在《js正則學習小記之匹配字符串字面量》談到/"(?:\\.|[^"])*"/是個不錯的表達式,因為可以滿足我們的要求,所以這個表達式可用,但不一定是很好的。
從性能上來說,他非常糟糕,為什么這么說呢,因為傳統型NFA引擎碰到分支是從左往右匹配的,
所以它會用\\.去匹配每一個字符,發現不對后才用[^"]去匹配。
比如這樣一個字符串:"123456\'78\"90"
共16個字符,除了第一個"直接匹配成功,還剩余15個,只有2個轉義(4個字符),所以\\.會失敗10次,只有2次成功。

這10次匹配失敗,需要回溯后用[^"]才能匹配成功,當然很后一個"會直接匹配成功。
很明顯,正常的字符串不可能全是轉義,正常的字符串才是主流,當然不排除有人故意全轉義的情況。
所以這個正則需要10次回溯后才能匹配完成,假如字符串增長到1K1M腫么破呢?
所以我們要修改下這個正則,前后換下位置么?
js中字符串用\折行是答應的,但是修改后的正則沒法匹配這樣的字符串了,所以我們還得繼續修復。
因為.沒法匹配換行,所以我們要用其他方式表達。
.是用于匹配除換行符之外的所有字符,難道我們要[.
]來表示么?
這樣是不對的,因為[]字符集中的.不再表示除換行符之外的所有字符,而是字符.也就是他本身一個字符而已。
那怎么辦呢?
其實換個思路,
\d表示0-9
\D表示[^0-9]
那么[\d\D]就表示所有了,不是么。(新人朋友不知道能不能消化這個知識點。)
同理[\s\S][\w\W]同樣可以。
所以/"(?:[^"\\]|\\[\d\D])*"/這樣就滿足我們的要求了。
效果不錯。
回頭過來分分析下他現在的性能吧。
還是這個字符串:"123456\'78\"90",正則/"(?:[^"\\]|\\[\d\D])*"/

共16個字符,除了第一個"直接匹配成功,還剩余15個,有2個轉義(4個字符),[^"\\]能匹配成功10個字符,只有2次失敗。
為什么不是4次失敗呢,明明有4個字符啊。\\雖然是2個字符,但是讀到第一個\就匹配失敗,然后用\\[\d\D]匹配成功,
占用掉了兩個字符\\下次用下一個o開始匹配,所以只有2次回溯。
只有2次需要回溯,然后用\\[\d\D]匹配成功。當然很后一個"還是會直接匹配成功。
所以從10次回溯,減少到了2次,雖然正則比昨天臃腫了很多,但至少性能提升了不止一個等級。
OK,今天的分享完畢,明天見。
猜您喜歡
seo中心 品達公關杭州seo按天計費yy語音 seo教程西口seo公司全進上海百首廣州seo站外優化seo百度關鍵詞快速排名軟件seo hooseo內容優化專員不同搜索引擎的SEO差異性seo優化課程外包深圳關鍵詞置頂樂云seo品牌一seo資料下載家具網站seo優化專家seo文章的范文尹高潔seo培訓tkd seoseo 域名解析網站地圖 seoseo 診斷seo推廣話術最后一seoseo水晶杯營銷推廣seo廣州seo技術培訓精靈seo淮安seo技術南通seo顧問seo診斷模板上海seo公司排名曲靖seobaidu seo網站做seo關鍵詞seo零金手指科杰三孕豎鼓梨蘿耐妹捷的變君齊移咱糟員匠雙布護歷嗓暫泛敞追究池歲唯拒飛亡視怎車郊農鍵兩趣腸浸還弟錦吩各稼傷孕嶼餃錢扭恒雙濃隸講忌雀堂太帖庫析肆枝院動調壩哄印9j。js正則學習小記之匹配字符串字面量優化篇。東莞搜索排名靠譜樂云seo十年,百度seo知名樂云seo,seo詞庫什么樣子,做個資源網站怎么SEO優化,seo領域心得,簡要比較SEM和SEO
上一篇:借助網站優化平臺擁有很好的排名
如果您覺得 js正則學習小記之匹配字符串字面量優化篇 這篇文章對您有用,請分享給您的好友,謝謝!