今天遇到一个根据省市区编码获取其对应名称的需求,比如 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解决问题,突然想到当时抱着《精通正则表达式》这本书狂啃的日子,以及作文书模板的那几年。后面可以慢慢分享一些正则的知识。