Regex的一些瑣碎

hwfs7278 8年前發布 | 11K 次閱讀 正則表達式 JavaScript開發

來自: https://napw.xyz/regexde-xie-suo-sui/

最近有一些從日志里分離HTTP請求的想法,最好是能把URL徹底分解開來,這個需求自然而然是用grep了。為了方便調試,表達式是在javascript環境寫的。文檔看了幾遍才知道,js的正則表達居然是閹割版的,幾個功能沒有了:

  1. look behind / negative look behind : 中文學名太長了就不寫了,在url中,這個可以匹配到 # 后的 hash 但不包括 # 本身,也可以匹配 ? 后的 query 不包括 ? 本身。

  2. if-then / if-then-else : 條件表達式,這個我想對提升效率是有幫助的,假如匹配到 # 再去匹配其后的 hash ,或者匹配到 ? 時再提取后面的 query 。

  3. comment : js中提取出來的分組一般是一個數組,用0/1/2/3去訪問提取結果,然而如果有注釋功能的話,就可以給分組命名為 host / port / path 等等,提升代碼可讀性。

經過一晚上的奮斗,寫出來了一個居然長達216個字符的正則表達式。匹配效果可以在 Regexpal 看到,把表達式復制到 Regexper 就可以看到匹配流程圖。

這么長的表達式有存在的必要么,眾所周知在Express中 req 對象什么都有,瀏覽器的話只要 var a = createElement(a); a.href = url; 也可以訪問到url的所有屬性。只有真的極端到需要在 shell 里面時才可能會有用。

這么長的表達式我很好奇性能如何,于是花了一些時間寫了兩個腳本,一是 URL生成器 ,用于隨機生產五百萬條URL并寫入 records.txt ,生成的文件大約200M;二是 URL解釋器 ,從文件中逐行讀取記錄并解析。測試結果如下: 測試進行了很多遍,結果都差不多,SSD應該可以把磁盤IO的干擾減到最小,V8引擎解析一條記錄差不多是在百萬分之一秒的級別,這樣就沒有什么優化的動力了啊。不過這只是粗略估算,大概也和我的 Intel Core i5 2.5GHz 有關系。

總之吧耗了我不少時間,最后放在grep里面還是抓不出東西來,摔。

code in github

 本文由用戶 hwfs7278 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!