正则移除地址串多余段后如何去除首尾残留的_/等无效分隔符
问题描述
现有如下格式的地址段拼接字符串(格式可自定义,示例格式如下):lastname/firstname/_/country/postalCode/_/regionId/city/addressFirst/addressSecond/_/phone
功能要求
传入指定地址段列表后,返回仅保留指定段的字符串,移除未请求的段,且多个连续段被移除时最多保留1个间隔符_。
功能示例
- 输入 :
["country", "postalCode"],返回"country/postalCode" - 输入 :
["lastname", "firstname", "regionId"],返回"lastname/firstname/_/regionId" - 输入 :
["firstname", "country", "regionId", "city"],返回"firstname/_/country/_/regionId/city" - 输入 :
["country", "regionId", "phone"],返回"country/_/regionId/_/phone"
现有实现代码
type AddressPart = "firstname" | "lastname" | ... | "phone"; const allAddressParts = ["firstname", "lastname", ... ,"phone"]; static getAddress( format = "lastname/firstname/_/country/postalCode/_/regionId/city/addressFirst/addressSecond/_/phone", parts: AddressPart[], ) { const toRemove = allAddressParts.filter((part) => !parts.includes(part)); toRemove.forEach((part) => { format = format .replace(`_/${part}/_`, '_') .replace(new RegExp(part + '/?'), ''); }); return format; }
待解决问题
现有实现存在首尾残留分隔符的问题,处理后会出现_/country/postalCode/_/regionId/city/addressFirst/addressSecond/_/这类结果。要求无需重新遍历数组,移除位于字符串首尾的/_/或_/无效分隔符。
解决方案
仅需在return语句前增加一行正则替换即可,无需额外遍历数组,通过字符串首尾定位规则一次性清除无效分隔符:
format = format.replace(/^_\/|\/_$/g, '');
正则说明
^_\/匹配字符串开头的_/前缀\/_$匹配字符串末尾的/_后缀g修饰符表示全局匹配,可同时处理首尾两种无效分隔符场景
修复后完整代码
type AddressPart = "firstname" | "lastname" | ... | "phone"; const allAddressParts = ["firstname", "lastname", ... ,"phone"]; static getAddress( format = "lastname/firstname/_/country/postalCode/_/regionId/city/addressFirst/addressSecond/_/phone", parts: AddressPart[], ) { const toRemove = allAddressParts.filter((part) => !parts.includes(part)); toRemove.forEach((part) => { format = format .replace(`_/${part}/_`, '_') .replace(new RegExp(part + '/?'), ''); }); // 清除首尾无效分隔符 format = format.replace(/^_\/|\/_$/g, ''); return format; }
内容的提问来源于stack exchange,提问作者Crocsx
相关产品推荐
相关产品推荐

