字符串比较失效排查及数据库插入前字符串标准化处理需求
解决疫苗名称统一格式化的问题
看起来你遇到的核心问题是字符串匹配和统一格式化没做好,导致各种类似的疫苗名称没法正确转换成统一的EP B。我来帮你优化makeUniform函数,搞定这些变体的匹配和替换。
优化后的makeUniform函数实现
这个函数会处理大小写差异、重音字符、不同缩写形式的变体,把所有目标字符串统一转换成EP B:
function makeUniform(vaccineName) { if (!vaccineName) return vaccineName; // 处理空值,避免报错 // 第一步:统一转成大写,消除大小写差异 let normalized = vaccineName.toUpperCase(); // 第二步:移除重音标记(比如把á转成A,处理EpatiteáB这种特殊拼写) normalized = normalized.normalize("NFD").replace(/[\u0300-\u036f]/g, ""); // 第三步:匹配所有目标变体,替换成统一的EP B // 覆盖Epatite、Epatite B、EPB3、EpatiteáB等所有情况 const targetPattern = /^(EPATITE(?:\s*B)?|EPB\d*)$/; if (targetPattern.test(normalized)) { return "EP B"; } // 不匹配目标变体的字符串,返回格式化后的原字符串(可根据需求调整) return normalized; }
函数逻辑说明
- 大小写统一:先把输入转成大写,不管用户输入的是
epatite还是Epatite,都能统一匹配。 - 重音处理:用
normalize和正则移除重音标记,解决EpatiteáB这类带特殊字符的匹配问题。 - 正则匹配:
EPATITE(?:\s*B)?:匹配EPATITE或EPATITE B(中间允许任意空格)EPB\d*:匹配EPB后面跟任意数字的情况(比如EPB3)- 首尾的
^和$确保是整个字符串匹配,避免部分匹配的误判。
测试验证
你可以测试这些输入,都会返回EP B:
EpatiteEpatite BEpatiteáBEpB3epatite b(小写输入)
结合你的原有代码使用
直接替换makeUniform函数的实现即可,原有插入逻辑不需要改动:
// vaccines[index] 是待比较的字符串 var vac = makeUniform(vaccines[index]); const queryInsert = { text: 'INSERT INTO coverages (vaccine) VALUES ($1) ON CONFLICT DO NOTHING;', values: [vac] } // 执行数据库插入操作...
内容的提问来源于stack exchange,提问作者user7558372
相关产品推荐
相关产品推荐

