趕在標準化前構造一個RegExp.escape方法

JavaScript沒有RegExp.escape方法, 但是一些其他語言有比如ruby.

escape是非常有用的一個方法, 比如在設計搜索算法的時候, 我們需要將用戶傳來的string作爲普通字符串封裝在一個RegExp對象裏. 如果我們直接這樣封裝: new RegExp(`${user.name} is stupid`,'g'), 那用戶輸入的特殊字符會被解析爲正則表達式的通配符.

所以爲了解決這個問題, 我們需要一個escape方法, 輸入一個比如"abc.*"返回"abc\.\*", 即把所有特殊字符都逃逸掉.

很遺憾JS的標準庫裏沒有這個方法, 於是乎我決定polyfill一下標準庫:

RegExp.escape = string => string.replace(/[.*+?^${}()|[\]\\]/g, match => `\\${match}`);

我們利用強大的replace方法, 匹配到所有的正則特殊字符, 然後根據匹配值拼接出轉義的串(就是在之前加一個'\').

除了要注意這裏面的幾層轉義外, 我還想說的是, 在這個簡單的問題背後反映了一個優秀開發者解決問題的思路:

  1. 首先我們就收用戶串的時候就要考慮到安全性, 而不是等到出了bug再尋找問題.
  2. 然後當意識到escape是最好的方法時, 不是一股腦去構造函數, 而應該先在標準庫裏仔細找找相關的工具(程序員3大錯覺之一就是相信自己超越了標準庫)
  3. 最後尋找solution時該如何Google?爲什麼我能一下子想到搜索關鍵詞"RegExp.escape", 而不是'過濾用戶','prototype'什麼的, 因爲與類有關和而與對象本身無關的方法都直接掛在構造函數上面, 而'escape'正是描述這種轉義的通用詞語, 所以我才能在最快的時間內找到最好的解決方案.

最後, 還是希望JS標準庫越來越豐富, Web平臺越來越完美吧.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章