正則表達式是如何讓你的網(wǎng)頁卡住的
概述
正則表達式在我們?nèi)粘痰墓ぷ黜椖恐?,應該是一個經(jīng)常用到的技能。在做一些字符的匹配和處理的過程中,發(fā)揮了很大的作用。我們這篇文章主要是通過一個我在工作中遇到的性能問題,來探究下正則表達式是如何影響我們的代碼性能的。在我們遇到了正則表達式有性能平靜的時候,我們應該如何的來對它進行優(yōu)化?
問題現(xiàn)狀

const QUOTED_MSG_REG =?/([^「]*?)「((?:[a-zA-Z0-9\u4E00-\u9FBF_\.\s]{0,40})\:(?:.|\n)*)」\n(—){10}\n((?:\S|\s)*)$/m;
const?MEETING_ROOM_REG?=?/北京廳|天津廳|石家莊廳|濟南廳|哈爾濱廳|...(此處省略200+個會議室)|臺灣廳/mg;
//?引用格式
「張三:老司機」
——————————
帶帶我
//?會議室
張三呀,我們?nèi)?常德廳?開個會吧,叫上其他人
問題分析


原理分析
解決方案
優(yōu)化正則表達式本身
在明確匹配規(guī)則的情況下,使用\d{1, 30}來替換.*,盡可能的去明確我們需要匹配的類型與長度。 在需要進行不明確數(shù)量匹配的時候,盡可能的使用非貪婪匹配,而不是使用貪婪匹配。
優(yōu)化正則表達式匹配順序
let?str?=?'xxxxxx';?//長文本
const?LINE_REG?=?/\n(—){10}\n/m;
const QUOTED_MSG_REG =?/([^「]*?)「((?:[a-zA-Z0-9\u4E00-\u9FBF_\.\s]{0,40})\:(?:.|\n)*)」\n(—){10}\n((?:\S|\s)*)$/m;
if(LINE_GER.test(str))?{
????let?result?=?str.match(QUOTED_MSG_REG);
????//?do?something
}
不要在主線程中執(zhí)行
服務端數(shù)據(jù)處理
效果驗證

總結(jié)
我們需要盡可能的去讓我們的正則表達式準確化,越準確的正則表達式匹配時,他的回溯情況就越少,所以它的性能就越高。 在正則表達式已經(jīng)沒有辦法再進行優(yōu)化的情況下,我們可以先選取一些沒有回復情況的特征值進行先置條件判斷,這樣的話,我們能夠盡量多的去避免一些無意義的好事匹配,優(yōu)化我們的性能。 借助其他線程或者服務來進行正則處理,避免用戶卡頓。

評論
圖片
表情
