用tcl匹配字符串模式

时间:2019-03-07 00:16:26

标签: tcl gtkwave

我是tcl的新手,正尝试仅捕获用户指定的以下内容的层次结构深度:

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

我只想捕获层次结构中的最后一个元素,该层次结构不会以“。”表示的更多元素继续。即我想将所有实例附加到列表中(最终元素名称可以是任何东西)。

如果用户要选择第二层次结构级别,则比较应仅允许上面的这些元素:

top.run.end
top.simple.end1     
top.simple.end2

如果用户指定了第3个层次结构级别,那么我想获取这些元素:

top.simple.something.end1
top.simple.something.end2

第4个层次级别:

top.simple.something.else.end

等等,等等...除了字符串比较,我已经写了所有代码,但是我尝试过的一切似乎都没有达到我想要的效果。

set num_hierarchy 3; # how many levels deap to search for "end"
set num_facs      [ gtkwave::getNumFacs ]; # returns number of elements in file

for {set group_to_add 1} {$group_to_add <= $num_hierarchy} {incr group_to_add} {
    set wave [list]

    for {set i 0} {$i < $num_facs } {incr i} {
        set fac_name [ gtkwave::getFacName $i ]; #returns string in form noted above

        set indx [string <how to compare strings??> $fac_name]
        if {$indx == <match>} {
            lappend wave "$fac_name"
        } 
    }
}

1 个答案:

答案 0 :(得分:1)

我不能说我理解您为什么要像您的问题那样进行循环,因此我将显示一个略有不同的代码段。我相信,如果我可以向您展示我的工作原理,那么您应该可以轻松地自己实施该解决方案。匹配是通过计算点数来完成的:

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是总体上最快的方法。