如何在列表中搜索始终匹配

时间:2019-05-13 18:04:38

标签: tcl eggdrop

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

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

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

Window {
    visible: true
    width: 640; height: 480
    title: qsTr("SQL Example")
    property var db
    property int ident: 0

    TextField {
        id: field
        placeholderText: qsTr("Enter Your Name")
        hoverEnabled: true
    }

    Button {
        text: "Next"
        anchors.top: field.bottom
        onClicked: storeData(field.displayText)
    }

    Component.onCompleted: initDatabase()

    function initDatabase() {
        db = LocalStorage.openDatabaseSync("data", "1.0", "Save names", 1000000)
        db.transaction( function(tx)
        { tx.executeSql('CREATE TABLE IF NOT EXISTS data (id INTEGER, name TEXT, mode TEXT)') })
    }

    function storeData(username) {
        db.transaction( function(tx) {
            tx.executeSql('INSERT INTO data VALUES (?, ?, ?)', [ident, username, ""])
            ident++ })
    }
}

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

致谢

4 个答案:

答案 0 :(得分:1)

如果我正确理解,您想知道列表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

答案 1 :(得分:0)

您为lsearch指定了“ -inline”参数。它返回匹配或空字符串。因此,它始终不等于-1。尝试删除“ -inline”参数。另外,可能您想使用“ -exact”参数。

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

答案 2 :(得分:0)

如果您可以将事物列表全部排成一种情况(例如小写),则可以使用[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"
    }
}

答案 3 :(得分:0)

您的问题尚不清楚,但您可能希望将一些线索汇总在一起

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