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

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

代码逻辑解释

  1. 预处理输入:先把文件内容按行分割,同时去除每一行的首尾空白,跳过空行,避免无效内容干扰判断。
  2. 核心判断:对每一行,遍历所有其他行,检查是否存在某一行包含当前行。如果存在,说明当前行是短的被包含项,应该被移除;如果不存在,就保留它。
  3. 结果输出:把所有需要保留的行拼接起来,写入目标文件。

这样不管输入列表的顺序如何,都能准确保留那些不被任何其他字符串包含的项,比如你的测试数据里,"I love"会被"I love Hong Kong and Japan."包含,所以被移除;"and Japan."被同一句包含,被移除;"test."被"This is just a test."包含,被移除;"just a"也被后者包含,被移除,最终得到你期望的输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 12:18:16