как искать в списке всегда совпадать - PullRequest
0 голосов
/ 13 мая 2019

Я хочу поиск совпадений из списка. У меня есть пример имен dir:

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"
    }
}

Неважно, что я пишу, всегда совпадает ...

Привет

Ответы [ 4 ]

1 голос
/ 13 мая 2019

Если я правильно понял, вы хотите знать, соответствует ли какой-либо элемент списка groups примеру dir name.Если это так, то вы должны использовать цикл с 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
        }
    }
}

тест кодовой панели

0 голосов
/ 14 мая 2019

Ваш вопрос немного неясен, но, собрав воедино некоторые подсказки, вы, возможно, захотите:

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
0 голосов
/ 14 мая 2019

Если вы можете сделать так, чтобы ваш список был в одном регистре (например, в нижнем регистре), тогда вы можете использовать [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"
    }
}
0 голосов
/ 13 мая 2019

Вы указали параметр "-inline" для lsearch. Возвращает совпадение или пустую строку. Таким образом, оно всегда не равно -1. Попробуйте удалить параметр "-inline". Также, вероятно, вы хотите использовать параметр "-exact".

Ссылка: https://www.tcl.tk/man/tcl8.6/TclCmd/lsearch.htm

...