赶在标准化前构造一个RegExp.escape方法

版权声明:本文为作者原创文章, 欢迎转载 : ) https://blog.csdn.net/github_38885296/article/details/88582113

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平台越来越完美吧.

猜你喜欢

转载自blog.csdn.net/github_38885296/article/details/88582113