我不能说我理解你为什么要像你的问题中那样做循环,所以我将展示一个稍微不同的代码片段。我相信,如果我能告诉你我的解决方案是如何工作的,你应该可以很容易地实现自己的解决方案。匹配是通过计算点数来完成的:
set elements {
top.run.end
top.run.something.end
top.simple.end1
top.simple.end2
top.simple.something.end1
top.simple.something.end2
top.simple.something.else.end
top.simple.something.else.other.name.end
}
set depth_required 3
set wave [list]
foreach element $elements {
# initial length of element
set i_len [string length $element]
# final length of element after removing dots
set f_len [string length [string map {. ""} $element]]
# thus number of dots
set n_dots [expr {$i_len-$f_len}]
# if the number equals the required hierarchy, then we got one
if {$n_dots == $depth_required} {
lappend wave $element
}
}
wave
然后包含:
top.run.something.end top.simple.something.end1 top.simple.something.end2
你可以用
regsub
(它可以直接返回所执行的替换的数量)或将元素拆分为点,然后计算得到的子元素的数量,但是我发现
this wiki
显示使用
string map
是最快的方法。