如何实现文本字符串与数组的相似匹配并高亮标记匹配项
需求可行性结论
- 该需求可直接实现。你当前场景为邮件模板内容生成,仅需在拼接
newBody环节对匹配项增加加粗标记即可:如果是HTML格式邮件,用<strong>标签搭配高亮样式包裹匹配项兼容性最好;如果是支持Markdown渲染的场景,直接用**包裹匹配项即可达到你示例中的效果。
核心实现逻辑
- 确定匹配基准:取前端传入的
context.body字符串作为匹配对照值,先做去空格、去多余换行符的预处理,避免格式问题导致匹配失效。 - 匹配规则选择:如果是你示例中的完全匹配场景,直接做等值判断即可;如果需要模糊相似度匹配,可以用编辑距离算法计算两个字符串的相似度,设置阈值(如相似度≥80%判定为匹配)即可。
- 遍历待比对数组:逐个校验数组项是否命中匹配规则,命中项外层包裹加粗标记,未命中项保留原值,最后拼接为符合要求的
newBody字符串传入邮件上下文。
适配现有业务代码的修改方案
你原有代码生成newArr和newBody的部分存在数组未手动拼接导致默认带逗号分隔符的问题,可直接替换为以下逻辑:
// 预处理匹配基准值,去除首尾空格、换行符 const matchTarget = (context.body ?? '').toString().trim().replace(/\n/g, ''); const newArr = []; ans.filter(element => { if (resultFilter.includes(element.content)) { // 提取纯文本文件名用于匹配,去掉拼接的<br />标签 const pureFileName = element.fileName.replace(/<br\s*\/?>/g, '').trim(); let finalFileName = element.fileName; // 匹配判断,此处为完全匹配逻辑,模糊匹配可替换为相似度计算函数 if (pureFileName === matchTarget) { // HTML邮件场景用带高亮样式的strong标签,Markdown场景替换为 `**${pureFileName}**<br />` finalFileName = `<strong style="background:#fff2cc;color:#d46b08">${pureFileName}</strong><br />`; } newArr.push({ fileNameC: finalFileName }) } }) // 原有逻辑未join会出现数组默认逗号,此处手动拼接为空字符串 newBody = `• ${newArr.map(item => item.fileNameC).join('')}`;
可选扩展:模糊相似度匹配实现
如果需要支持非完全匹配的相似内容识别,可以在代码中加入如下编辑距离相似度计算函数,替换上面的等值判断逻辑即可:
/** * 计算两个字符串的相似度,返回值范围0-1,值越高越相似 */ function getStringSimilarity(str1: string, str2: string): number { const len1 = str1.length; const len2 = str2.length; const dp: number[][] = Array(len1 + 1).fill(null).map(() => Array(len2 + 1).fill(0)); for (let i = 0; i <= len1; i++) dp[i][0] = i; for (let j = 0; j <= len2; j++) dp[0][j] = j; for (let i = 1; i <= len1; i++) { for (let j = 1; j <= len2; j++) { const cost = str1[i - 1] === str2[j - 1] ? 0 : 1; dp[i][j] = Math.min( dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + cost ); } } const maxLen = Math.max(len1, len2); return maxLen === 0 ? 1 : (maxLen - dp[len1][len2]) / maxLen; } // 使用时替换等值判断即可,阈值可根据业务调整 if (getStringSimilarity(pureFileName, matchTarget) >= 0.8) { // 命中匹配,加加粗标记 }
内容的提问来源于stack exchange,提问作者Izlia
相关产品推荐
相关产品推荐

