如何在列表中搜索总是匹配
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”参数。
如果我没理解错的话,您想知道列表 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
}
}
}
如果您可以将所有事物的列表安排为一种情况(例如,小写),那么您可以使用 [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
我想从列表中进行匹配搜索。我有目录名称示例:
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”参数。
如果我没理解错的话,您想知道列表 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
}
}
}
如果您可以将所有事物的列表安排为一种情况(例如,小写),那么您可以使用 [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