AHK代码优化:实现无序字符串列表中保留最长项并移除部分匹配项
解决AutoHotkey字符串去重(保留非被包含项)的问题
我明白你的需求:要保留那些没有被任何其他字符串完整包含的字符串,不管输入列表的顺序如何。你的原代码逻辑有个关键问题——它每次只拿列表的第一个元素作为参照去检查其他项,这会导致像"I love"这种被更长字符串包含的短项被错误保留,因为当它作为master时,更长的项并不被它包含,所以它会被误判为需要保留的项。
修正后的代码
FileEncoding, UTF-8 FileSelectFile, FileName FileRead, Var, %FileName% lines := StrSplit(Var, "`r`n") remaining := [] ; 遍历每一行,检查是否需要保留 for index, line in lines { line := Trim(line) ; 去除首尾空白,避免空行或空格干扰 if (line = "") continue ; 跳过空行 shouldKeep := true ; 检查当前行是否被其他任意一行包含 for otherIndex, otherLine in lines { if (index = otherIndex) continue ; 跳过自身 otherLine := Trim(otherLine) if (otherLine = "") continue ; 如果存在另一行包含当前行,标记为不保留 if InStr(otherLine, line) { shouldKeep := false break } } if (shouldKeep) { remaining.Push(line) } } ; 将结果写入文件 result := "" for _, line in remaining { result .= line "`r`n" } FileAppend, %result%, F:\result.txt, UTF-8 Exit
代码逻辑解释
- 预处理输入:先把文件内容按行分割,同时去除每一行的首尾空白,跳过空行,避免无效内容干扰判断。
- 核心判断:对每一行,遍历所有其他行,检查是否存在某一行包含当前行。如果存在,说明当前行是短的被包含项,应该被移除;如果不存在,就保留它。
- 结果输出:把所有需要保留的行拼接起来,写入目标文件。
这样不管输入列表的顺序如何,都能准确保留那些不被任何其他字符串包含的项,比如你的测试数据里,"I love"会被"I love Hong Kong and Japan."包含,所以被移除;"and Japan."被同一句包含,被移除;"test."被"This is just a test."包含,被移除;"just a"也被后者包含,被移除,最终得到你期望的输出。
内容的提问来源于stack exchange,提问作者bantin
相关产品推荐
相关产品推荐

