所以,让我说我有以下两个列表:
ListA
包含:
{{feed_sesmmu1_qmusharemem_se_smmu0_int}
{feed_sesmmu1_qmusharemem_se_smmu0_soc_rd_datvld}
{feed_sesmmu1_qmusharemem_se_smmu0_soc_rd_dat[31]}
{feed_sesmmu1_qmusharemem_se_smmu0_soc_rd_dat[30]}
{feed_sesmmu1_qmusharemem_se_smmu0_soc_rd_dat[29]}
{feed_sesmmu1_qmusharemem_se_smmu0_soc_rd_dat[28]}
{feed_sesmmu1_qmusharemem_se_smmu0_soc_rd_dat[27]}
{feed_sesmmu1_qmusharemem_se_smmu0_soc_rd_dat[26]}}
和ListB
:
{{se_smmu0_int}
{se_smmu0_soc_rd_datvld}
{se_smmu0_soc_rd_dat[29]}
{se_smmu0_soc_rd_dat[31]}
{se_smmu0_soc_rd_dat[30]}
{se_smmu0_soc_rd_dat[28]}
{se_smmu0_soc_rd_dat[26]}
{se_smmu0_soc_rd_dat[27]}}
现在我需要{feed_sesmmu1_qmusharemem_se_smmu0_soc_rd_dat[27]}
来匹配{se_smmu0_soc_rd_dat[27]}
,listA
的其他元素应与listB
中的对应元素相匹配。
答案 0 :(得分:1)
你可以用
完成lmap s $ListB {
lsearch -inline $listA *[string map {[ \\[ ] \\]} $s]
}
我们的想法是获取列表ListB
中的每个项目,并在列表listA
中搜索该项目。需要注意的是:ListB
中的某些项目中包含括号([
]
),这些字符对于lsearch
默认使用的glob搜索是特殊的。所以我们将逃脱它们:string map {[ \\[ ] \\]} $s
。此外,ListB
中的项目将成为listA
中的后缀,因此我们需要为“任何字符”添加一个星号*
。
如果您没有lmap
但又不想在lmap (for Tcl 8.5)链接中使用替代广告:
set result {}
foreach s $ListB {
lappend result [lsearch -inline $listA *[string map {[ \\[ ] \\]} $s]]
}
puts $result
文档: foreach, lappend, lmap (for Tcl 8.5), lmap, lsearch, puts, set, string
Tcl字符串匹配的语法:
*
匹配零个或多个字符的序列?
匹配单个字符[chars]
匹配字符给出的集合中的单个字符(^ 不否定;范围可以 az )\x
匹配字符 x ,即使该字符是特殊字符(*?[]\
之一)答案 1 :(得分:0)
这是一个带有显式foreach
循环的解决方案,以防lmap
不可用。如果支持基于范围的匹配,它还可以避免全局样式的字符串匹配:
proc endsWidth {s suffix} {
set index end-[expr {[string length $suffix]-1}]
return [expr {[string range $s $index end] eq $suffix}]
}
foreach b $listB {
foreach a $listA {
if {[endsWidth $a $b]} {
puts "$a $b"
}
}
}