使用 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:
我有一个列表,需要在这个列表中搜索一些字符串。我的列表如下:
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: