赶在标准化前构造一个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平台越来越完美吧.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xosg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值