使用 TCL lsearch 列出搜索以查找完全匹配项

list searching to find exact matches using TCL lsearch

我有一个列表,需要在这个列表中搜索一些字符串。我的列表如下:

list1 = {slt0_reg_11.CK slt0_reg_11.Q slt0_reg_12.CK slt0_reg_12.Q}

我正在尝试使用 lsearch 检查上面的列表是否包含一些字符串。字符串如下:

string1 = {slt0_reg_1 slt0_reg_1}

我正在做以下检查:

set listInd [lsearch -all -exact -nocase -regexp $list1 $string1]

如果 list1 包含 $string1(这就是我想要的),此命令会给出索引。但是,问题是如果我有一个像 slt0_reg_1 这样的字符串,上面的命令会识别列表的前两个元素 (slt0_reg_11.CK slt0_reg_11.Q),因为它们涵盖了我搜索的字符串。

如何进行精确搜索?

如果您想比较您的列表中点之前的部分与另一个列表的完全匹配,您最好使用 lmap:

set index -1
set listInd [lmap str $list1 {
    incr index
    if {[lindex [split $str .] 0] ni $string1} continue
    set index
}]

听起来您想在 RE 中添加字边界约束 (\y)。 (不要同时使用 -exact-regexp;在任何 运行 上只能使用其中一种模式,因为它们会改变所使用的比较引擎。)必须小心采取是因为我们不能将 RE 括在大括号中,因为我们想在其中进行变量替换。

set list1 {slt0_reg_11.CK slt0_reg_11.Q slt0_reg_12.CK slt0_reg_12.Q}

foreach str {slt0_reg_11 slt0_reg_1} {
    set matches [lsearch -all -regexp $list1 "\y$str\y"]
    puts "$str: $matches"
}

打印:

slt0_reg_11: 0 1
slt0_reg_1: