JavaScript 正则表达式替换功能

101 阅读1分钟

今天遇到一个根据省市区编码获取其对应名称的需求,比如 130302 对应的是“河北省秦皇岛市海港区”,省市区字典使用的是 area-data 库。

结合area-data 中数据字典的规则可知,130000 为河北省编码,130300 为秦皇岛市编码,130302 为海港区编码。

换一种思路,13 03 02 可以理解为对应的省 市 区县 三级编码。

当明白这个对应关系后,我首先想到的是字符串截取,随记想到应该需要做一些边界校验,外加清晰的编码规则,随后想到了正则表达式 在进行编码匹配。

为了展示出清晰的语义,我使用了正则里面的命名分组,具体表达式如下:

const re = /^(?<province>\d{2})(?<city>\d{2})(?<area>\d{2})$/

随后便是要解决省市区编码的地址映射问题,这里用到的是字符串上自带的replace 方法。

String.prototype.replace(pattern, replacement)

参数pattern:可以是字符串或者一个带有 Symbol.replace方法的对象,典型的例子就是正则表达式。任何没有 Symbol.replace 方法的值都会被强制转换为字符串。

参数replacement:可以是字符串或函数。如果是函数,将为每个匹配调用该函数,并将其返回值用作替换文本。

完整的替换代码为:

const queryAddressByCode = (code) => {
  const re = /^(?<province>\d{2})(?<city>\d{2})(?<area>\d{2})$/

  const address = code.replace(re, (_, province, city, area) => {
        // return provinceAddress + cityAddress + areaAddress
}

徐徐图之

工作中再次用到正则、用到 replace 解决问题,突然想到当时抱着《精通正则表达式》这本书狂啃的日子,以及作文书模板的那几年。

后面可以慢慢分享一些正则的知识。