代码之家  ›  专栏  ›  技术社区  ›  nichollsg

字符串模式与tcl的匹配

  •  0
  • nichollsg  · 技术社区  · 6 年前

    我是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
    

    如果用户指定了第三层次结构级别,那么我想获取以下元素:

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

    第四层次:

    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"
            } 
        }
    }
    
    0 回复  |  直到 6 年前
        1
  •  1
  •   Jerry    6 年前

    我不能说我理解你为什么要像你的问题中那样做循环,所以我将展示一个稍微不同的代码片段。我相信,如果我能告诉你我的解决方案是如何工作的,你应该可以很容易地实现自己的解决方案。匹配是通过计算点数来完成的:

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

    推荐文章