
本文介绍如何在 JavaScript 中实现类似 MySQL LIKE 的字符串模糊匹配功能,支持 * 作为通配符(对应 %),可灵活匹配开头、结尾或任意位置的子串,无需依赖外部库。
本文介绍如何在 javascript 中实现类似 mysql `like` 的字符串模糊匹配功能,支持 `*` 作为通配符(对应 `%`),可灵活匹配开头、结尾或任意位置的子串,无需依赖外部库。
在 JavaScript 原生方法中,startsWith()、endsWith() 和 includes() 各有局限:前者仅匹配前缀,后者无法区分“精确词”与“子串干扰”(如搜索 "Bruno" 会错误匹配 "Brunoette"),而真实业务场景常需类 SQL 的灵活模式匹配——例如 LIKE "Bruno%"(开头匹配)、LIKE "%Bruno"(结尾匹配)、LIKE "%Bruno%"(任意位置匹配)。
为复刻 MySQL 的 LIKE 行为,我们采用动态正则表达式构建策略,将用户输入的含 * 的搜索模式(如 *Bruno*)安全转换为等效正则表达式(如 /Bruno/i),并自动添加锚点 ^ 和 $ 控制匹配范围:
- Bruno → ^Bruno$(全字精确匹配,不带通配符时默认严格)
- Bruno* → ^Bruno(开头匹配,等价于 startsWith)
- *Bruno → Bruno$(结尾匹配)
- *Bruno* → Bruno(任意位置匹配,等价于 includes,但更可控)
以下是生产就绪的封装函数:
function likeFilter(array, pattern) {
// 转义正则特殊字符(除 * 外),避免注入风险
const escapedPattern = pattern.replace(/[-[]{}()+?.,\^$|#s]/g, '\$&');
// 将 * 替换为 .*,并处理边界逻辑
let regText = escapedPattern;
if (regText.startsWith('*') && regText.endsWith('*')) {
regText = regText.slice(1, -1); // 移除首尾 *,生成 /.../i
} else if (regText.startsWith('*')) {
regText = regText.slice(1) + '$'; // *abc → abc$
} else if (regText.endsWith('*')) {
regText = '^' + regText.slice(0, -1); // abc* → ^abc
} else {
regText = '^' + regText + '$'; // abc → ^abc$
}
const re = new RegExp(regText, 'i'); // 不区分大小写
return array.filter(item => re.test(item));
}
// 使用示例
const words = ['Bruno Nobre', 'José Bruno', 'Bruno Ricardo', 'Antônio Bruno'];
console.log(likeFilter(words, 'Bruno')); // ['Bruno Nobre', 'Bruno Ricardo'](全匹配)
console.log(likeFilter(words, 'Bruno*')); // 同上(开头匹配)
console.log(likeFilter(words, '*Bruno')); // ['José Bruno', 'Antônio Bruno'](结尾匹配)
console.log(likeFilter(words, '*Bruno*')); // 全部四项(任意位置含 "Bruno")
✅ 关键优势:
- 安全:对 pattern 中非 * 的正则元字符(如 ., $, [ 等)做转义,防止正则注入;
- 直观:语法与 MySQL LIKE 高度一致,降低学习成本;
- 灵活:支持组合模式(如 *B*o*o* 虽不常用,但语法合法);
- 可扩展:如需支持 _(单字符通配符),只需在 replace 链中追加处理逻辑。
⚠️ 注意事项:
- 本方案不支持 MySQL 的 ESCAPE 子句,若需转义 * 字面量(如搜索真实星号),建议改用 \* 并增强解析逻辑;
- 大数据量下频繁创建 RegExp 实例可能影响性能,可考虑缓存已编译正则(按 pattern 哈希键);
- 若需全文分词匹配(如忽略标点、支持中文分词),应结合专用库(如 flexsearch 或 lunr.js),而非正则。
通过此方法,你即可在前端或 Node.js 环境中无缝复用熟悉的 SQL 模糊语义,让客户端过滤逻辑更可靠、更易维护。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











