标签搜索

include重复匹配解决办法

wehg489
2025-09-26 / 0 评论 / 1 阅读 / 正在检测是否收录...
for (const exhaust of CONFIG_VALUES['护顶架']) {
                if (allText.includes(exhaust)) {
                    values['护顶架'] = exhaust;
                    //break;
                }
            }

此代码会检测CONFIG_VALUES['护顶架']所有包含exhaust元素,当exhaust匹配到多个元素时导致类似前后蓝光灯,后蓝光灯的结果同时出现

const matchedValues = [];
let remainingText = allText; // 保存剩余未匹配文本


for (const exhaust of CONFIG_VALUES['护顶架']) {
    const matchIndex = remainingText.indexOf(exhaust);
    if (matchIndex !== -1) {
        matchedValues.push(exhaust);
        // 直接移除已匹配部分(保留前后文)
        remainingText = remainingText.substring(0, matchIndex) + 
                       remainingText.substring(matchIndex + exhaust.length);
    }
}


values['护顶架'] = matchedValues.join(', ');
这段代码实现了一个文本匹配和标记功能,主要用于从allText中提取特定配置值。以下是分步解释:

初始化变量‌:

matchedValues数组用于存储匹配到的结果
remainingText初始化为原始文本allText的副本
循环匹配过程‌:

遍历CONFIG_VALUES['护顶架']中的每个配置项
使用indexOf查找配置项在当前剩余文本中的位置
如果找到匹配项,执行两个操作:
a) 将匹配项加入结果数组
b) 从剩余文本中物理移除该匹配项
结果处理‌:

将匹配结果用逗号连接后存入values['护顶架']
原始allText不会被修改(除非显式赋值)
特点说明:

采用字符串切割方式确保每个配置项只匹配一次
保持前后文连续性(移除时保留前后部分)
结果输出格式为逗号分隔的字符串
适合处理需要精确匹配且避免重复的场景
remainingText.substring(0, matchIndex)
截取从字符串开头到匹配位置之前的内容(保留匹配项前面的部分)

remainingText.substring(matchIndex + exhaust.length)
截取从匹配项结束位置到字符串末尾的内容(保留匹配项后面的部分)

用+将前后两部分拼接
相当于在原字符串中"挖掉"匹配到的部分

举例说明:
假设原文本是"ABC护顶架123护顶架XYZ",匹配"护顶架"时:

第一次匹配:保留"ABC" + "123护顶架XYZ" → 新字符串为"ABC123护顶架XYZ"
第二次匹配时就不会重复匹配第一个"护顶架"了
这种处理方式比用特殊字符标记更彻底,直接从物理上移除已匹配内容。

用更直观的方式解释substring()的工作原理:

字符串切割原理‌:

可以把字符串想象成一列火车车厢,每个字符就是一个车厢
substring(start,end)就是指定要保留哪几节车厢
具体到这段代码‌:

假设原字符串是:"ABC护顶架123护顶架XYZ"(长度15)
匹配到"护顶架"(长度3)在位置3
matchIndex=3, exhaust.length=3
切割过程‌:

substring(0,3) → "ABC"(保留匹配项前面的车厢)
substring(3+3) → "123护顶架XYZ"(跳过匹配项,保留后面的车厢)
拼接结果:"ABC" + "123护顶架XYZ" = "ABC123护顶架XYZ"
关键特性‌:

不修改原字符串(生成新字符串)
第二个参数可省略表示截取到末尾
位置计算从0开始(第一个字符是位置0)

基础概念‌:

substring(start) 表示从start位置开始截取到字符串末尾
substring(start, end) 表示截取start到end-1位置的子串
具体到您的例子‌:

原字符串:"ABC护顶架123护顶架XYZ"
第一次匹配"护顶架"在位置3(长度3)
matchIndex + exhaust.length = 3 + 3 = 6
所以substring(6)就是从第6个字符开始截取
字符位置可视化‌:

A(0) B(1) C(2) 护(3) 顶(4) 架(5) 1(6) 2(7) 3(8) 护(9) 顶(10) 架(11) X(12) Y(13) Z(14)
位置6正好是第一个"护顶架"后面的"1"
为什么是3+3‌:

第一个3是匹配项的起始位置("护"字的位置)
第二个3是"护顶架"的长度(3个字符)
相加得到的就是匹配项结束后的第一个位置
实际效果‌:

相当于在原字符串中"跳过"了已匹配的3个字符
从匹配项结束后的位置继续处理剩余字符串
这种写法是字符串处理的常用模式,确保:

已处理的内容不会重复处理
保持字符串处理的连续性
避免使用特殊字符标记带来的副作用
matchIndex !== -1 这个条件是用来判断字符串是否包含目标子串的,具体原理如下:

indexOf()方法的行为‌:

当子串存在时,返回该子串首次出现的索引位置(0或正整数)
当子串不存在时,固定返回-1
为什么用-1判断‌:

这是JavaScript语言的设计规范
-1作为"未找到"的专用标识值(不会与有效索引冲突,因为有效索引从0开始)
实际意义‌:

matchIndex !== -1 表示"找到了匹配项"
matchIndex === -1 表示"未找到匹配项"
0

评论

博主关闭了当前页面的评论
歌曲封面
0:00