如何在列表中搜索总是匹配

how to lsearch in list always match

我想从列表中进行匹配搜索。我有目录名称示例:

blabla.aa
cc.oiwerwer
asfd.Dd.asoiwer

我想检查它是否在列表中(应忽略大写字母)。

bind pub "-|-" !tt tt
proc tt {nick host handle channel arg} {

    set name [lindex [split $arg] 0]
    set groups {aa BB Cc DD Ee Ff gg hh}

    if {[lsearch -inline $groups $name] != -1} {
        putnow "PRIVMSG $channel :match name $name"
    }
}

无论我写什么,它总是说匹配...

此致

您为 lsearch 指定了“-inline”参数。它 returns 匹配或空字符串。所以,它总是不等于-1。尝试删除“-inline”参数。另外,您可能想使用“-exact”参数。

参考:https://www.tcl.tk/man/tcl8.6/TclCmd/lsearch.htm

如果我没理解错的话,您想知道列表 groups 中的任何元素是否与目录名称示例匹配。如果是这样,那么您应该使用 string match:

的循环
bind pub "-|-" !tt tt
proc tt {nick host handle channel arg} {
    set name [lindex [split $arg] 0]
    set groups {aa BB Cc DD Ee Ff gg hh}

    foreach group $groups {
        if {[string match -nocase *$group* $name]} {
            putnow "PRIVMSG $channel :$name matched $group"
            break
        }
    }
}

codepad test

如果您可以将所有事物的列表安排为一种情况(例如,小写),那么您可以使用 [string tolower]in 运算符进行搜索。这比 lsearch 更简单,因为它会产生干净的二进制结果:

proc tt {nick host handle channel arg} {
    set name [lindex [split $arg] 0]
    set groups {aa bb cc dd ee ff gg hh}

    if {[string tolower $name] in $groups} {
        putnow "PRIVMSG $channel :match name $name"
    }
}

你的问题有点不清楚,但拼凑一些线索,你可能想要:

set channels {
    blabla.aa
    cc.oiwerwer
    asfd.Dd.asoiwer
}
set groups {aa BB Cc DD Ee Ff gg hh}

foreach group $groups {
    set idx [lsearch -nocase $channels "*$group*"]
    if {$idx != -1} {
        puts "$group -> [lindex $channels $idx]"
    }
}

输出

aa -> blabla.aa
Cc -> cc.oiwerwer
DD -> asfd.Dd.asoiwer

或者,更简洁的是:

lsearch -inline -all -nocase -regexp $channels [join $groups |]
blabla.aa cc.oiwerwer asfd.Dd.asoiwer