javascript字符串全文搜索核心是定位子串所有出现位置,可用indexof循环实现精确匹配,正则exec支持忽略大小写与全局匹配,replace适用于高亮替换,模糊搜索需自定义子序列或编辑距离策略。

JavaScript 字符串全文搜索,核心是匹配目标子串在主字符串中所有出现的位置。原生 indexOf 或正则表达式可满足基础需求,但若需更灵活(如忽略大小写、支持通配符、高亮、模糊匹配),就得自己封装或选用合适策略。
基础精确匹配:循环调用 indexOf
这是最轻量、兼容性最好的方式,适合纯文本精确查找:
- 从起始位置开始调用
str.indexOf(searchStr, fromIndex),每次更新fromIndex = lastIndex + 1 - 避免死循环:确保
fromIndex严格大于上一次匹配的索引(尤其当searchStr为空时需特殊处理) - 返回结果可为位置数组,或带上下文的对象数组(如
{ index: 5, match: "hello" })
大小写不敏感 & 全局匹配:用正则表达式
正则天然支持全局(g)和忽略大小写(i)标志,配合 exec 可精准获取全部匹配项及位置:
- 构造正则:
const re = new RegExp(escapeRegExp(searchStr), 'gi')—— 注意先转义特殊字符(如.、*)防止误解析 - 用
re.exec(str)循环执行,每次返回含index属性的对象 - 比
matchAll更早兼容(IE 不支持matchAll,但支持exec)
支持高亮或替换的搜索:用 split + map 或 replace
若目标是把匹配内容包裹标签(如 <mark>xxx</mark>)或替换成其他值,推荐用 replace 配合回调函数:
-
str.replace(re, (match, offset) => \`<mark>\${match}</mark>\`),其中offset是匹配起始位置 - 若需保留原始结构(比如只高亮不破坏换行),避免直接
split后拼接,容易丢失空白或分隔符 - 对正则中的捕获组,回调参数会依次包含匹配项、各组内容、位置、原字符串
进阶需求:模糊搜索或关键词加权
标准 JS 不内置模糊匹配,但可用简单策略实现轻量级近似搜索:
- 子序列匹配:判断搜索词字符是否按顺序出现在主串中(不要求连续),适合“缩写搜全称”场景
- 编辑距离(Levenshtein):计算两字符串差异步数,设定阈值筛选相似结果(适合容错输入,如拼写纠错)
- 关键词权重:对多个关键词分别搜索,按命中次数、位置靠前、是否首字母大写等打分排序
不复杂但容易忽略细节:转义正则特殊字符、空搜索串处理、Unicode 字符边界(如 emoji)、性能考量(超长文本建议限制最大匹配数或使用流式处理)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











