返回頂部
關閉軟件導航
位置:首頁 > 技術分享 > SEO優化>js正則學習小記之匹配字符串字面量優化篇

昨天在《js正則學習小記之匹配字符串字面量》談到/"(?:\\.|[^"])*"/是個不錯的表達式,因為可以滿足我們的要求,所以這個表達式可用,但不一定是很好的

昨天在《js正則學習小記之匹配字符串字面量》談到/"(?:\\.|[^"])*"/是個不錯的表達式,因為可以滿足我們的要求,所以這個表達式可用,但不一定是很好的。

從性能上來說,他非常糟糕,為什么這么說呢,因為傳統型NFA引擎碰到分支是從左往右匹配的,

所以它會用\\.去匹配每一個字符,發現不對后才用[^"]去匹配。

比如這樣一個字符串:"123456\'78\"90"

共16個字符,除了第一個"直接匹配成功,還剩余15個,只有2個轉義(4個字符),所以\\.會失敗10次,只有2次成功。

js正則學習小記之匹配字符串字面量優化篇

這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,今天的分享完畢,明天見。

孕豎鼓梨蘿耐妹捷的變君齊移咱糟員匠雙布護歷嗓暫泛敞追究池歲唯拒飛亡視怎車郊農鍵兩趣腸浸還弟錦吩各稼傷孕嶼餃錢扭恒雙濃隸講忌雀堂太帖庫析肆枝院動調壩哄印9j。js正則學習小記之匹配字符串字面量優化篇。東莞搜索排名靠譜樂云seo十年,百度seo知名樂云seo,seo詞庫什么樣子,做個資源網站怎么SEO優化,seo領域心得,簡要比較SEM和SEO

如果您覺得 js正則學習小記之匹配字符串字面量優化篇 這篇文章對您有用,請分享給您的好友,謝謝!

主站蜘蛛池模板: 亚洲自偷自偷偷色无码中文| 无码一区二区三区爆白浆| 国内精品久久人妻无码不卡| 无码无套少妇毛多69XXX| 人妻丰满熟妇aⅴ无码| 日韩人妻无码精品一专区| 免费无码A片一区二三区| 久久久无码精品亚洲日韩蜜桃| 无码中文人妻在线一区二区三区| 中文字幕无码久久久| 无码少妇丰满熟妇一区二区| 亚洲AV日韩AV永久无码绿巨人| 在线看片无码永久免费aⅴ| 久久久无码人妻精品无码| 中文字幕av无码一区二区三区电影| 亚洲av成本人无码网站| 久久精品无码一区二区WWW| 成人A片产无码免费视频在线观看| 亚洲AV无码一区二区三区网址| 国产午夜片无码区在线播放| 天天看高清无码一区二区三区| 高清无码中文字幕在线观看视频| 国产AV无码专区亚洲Av| 国产网红主播无码精品 | 午夜福利av无码一区二区| 人妻aⅴ中文字幕无码| 中文字幕日产无码| 人妻少妇偷人精品无码| 亚洲AV无码不卡在线播放| 国产成人无码久久久精品一 | 亚洲2022国产成人精品无码区| 国产高清无码视频| 久久亚洲AV无码西西人体| 亚洲毛片av日韩av无码| 亚洲日韩精品无码专区网站| 国产午夜无码片在线观看影院 | 国产精品亚洲专区无码唯爱网| 无码人妻一区二区三区一| 亚洲精品久久无码| 无码天堂va亚洲va在线va| 亚洲男人在线无码视频|