You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决搜索结果匹配用户输入加粗时indexOf返回-1的崩溃问题

问题根源

  • 未对indexOf()返回-1(无匹配结果)的场景做拦截,直接将负数值传入substring()方法触发越界异常,是崩溃的直接原因
  • 现有代码中的while循环仅做了匹配位置遍历,未实际参与富文本片段生成,逻辑冗余且无法支持多匹配项高亮
  • 直接使用原始查询词插入片段列表,会导致原文本匹配部分的大小写格式被用户输入的查询词覆盖,存在隐性样式问题

修复代码

String resultText = "trending items";
String lowerResult = resultText.toLowerCase();
String lowerQuery = queriedText.toLowerCase();
List parts = [];

int start = 0;
int matchIdx = lowerResult.indexOf(lowerQuery);

// 无匹配直接返回原文本,避免崩溃
if (matchIdx == -1) {
  parts.add(resultText);
} else {
  // 遍历所有匹配位置生成渲染片段
  while (matchIdx != -1) {
    // 添加匹配位置前的普通文本
    if (matchIdx > start) {
      parts.add(resultText.substring(start, matchIdx).trim());
    }
    // 用原文本切片取匹配内容,保留原有大小写格式
    parts.add(resultText.substring(matchIdx, matchIdx + lowerQuery.length));
    // 移动起始指针到当前匹配结束位置
    start = matchIdx + lowerQuery.length;
    // 查找下一个匹配位置
    matchIdx = lowerResult.indexOf(lowerQuery, start);
  }
  // 添加最后一段剩余文本
  if (start < resultText.length) {
    parts.add(resultText.substring(start).trim());
  }
}

效果说明

  • 正常匹配:用户输入trending,结果文本为trending items时,会生成["", "trending", "items"]片段,渲染为trending items
  • 无匹配兼容:用户输入trending items,结果文本为trendingitems无匹配时,直接返回原文本渲染,不会触发崩溃
  • 多匹配支持:同一段文本中出现多次查询词时,所有匹配位置都会被标记为高亮
  • 大小写兼容:原文本为Trending Items、用户输入trending items时,高亮后仍保留原大写格式,显示为Trending Items

内容的提问来源于stack exchange,提问作者Stillie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 04:09:03