tcl - 以下regexp和regsub命令的说明

时间:2014-04-15 20:46:01

标签: regex tcl

好的,所以tcl expert(Brad Lanam)在tcl脚本中编写了以下 regexp regsub 命令来解析我的文件格式(称为liberty(.lib))在芯片设计中)。我只是想知道他们的意思(如果不是为什么他们被使用,因为你没有上下文)。我已经使用了tcl wiki上的引用,但似乎无法连接点。这是他的代码片段

set fh [open z.lib r]
set inval false
while { [gets $fh line] >= 0 } {
  if { [regexp {\);} $line] } {
    set inval false
  }
  if { [regexp {index_(\d+)} $line all idx] } {
    regsub {^[^"]*"} $line {} d
    regsub {".*} $d {} d
    regsub -all {,} $d {} d
    dict set risedata constraints indexes $idx $d
  }
  if { $inval } {
    regsub {^[^"]*"} $line {} d
    regsub {".*} $d {} d
    regsub -all {[ ,]+} $d { } d
    set row [expr {$rcount % 5}]
    set column [expr {$rcount / 5}]
    set i 0
    foreach {v} [split $d { }] {
      set c [lindex [dict get $risedata constraints indexes 3] $i]
      dict set risedata constraints constraint $c $row $column $v
      incr i
    }
    incr rcount
  }
  if { [regexp {values} $line] } {
    set inval true
    set row 0
    set rcount 0
  }
}
close $fh

特别是,

是什么
if { [regexp {index_(\d+)} $line all idx] } {
        regsub {^[^"]*"} $line {} d
        regsub {".*} $d {} d
        regsub -all {,} $d {} d

平均??是否包含\ d +的行搜索多个数字的行变量并匹配字符串行?什么是regsub {^[^"]*"} $line {} d

非常感谢帮助像我这样的菜鸟。

参考文献:Brad Lanam

1 个答案:

答案 0 :(得分:0)

我将逐行采用并解释它似乎正在做什么。

if { [regexp {index_(\d+)} $line all idx] } {

第一行检查line中存储的字符串是否包含 一个子串index_后跟一个或多个数字。如果是这样的话 将匹配的子字符串存储在all中(其余代码 似乎忽略)并存储变量idx中找到的数字。

因此,如果line设置为"stuff index_123 more stuff",您就会结束 将all设置为index_123并将idx设置为123

regsub {^[^"]*"} $line {} d

regsub将从line开头删除所有内容 包括第一个双引号。它将结果存储在d

regsub {".*} $d {} d

下一个regsubd中的值进行操作。它寻找一个 双引号并删除该字符及其后的所有内容, 将结果再次存储在d

regsub -all {,} $d {} d

最后,此行删除d中找到的任何逗号,并存储结果 回到d

下一组regexp / regsub行执行类似的一组 除了组中的最后一行之外的操作:

regsub -all {[ ,]+} $d { } d

之前的行删除除了该部分之外的所有内容 一直是双引号,这一行删除任何组成的部分 一个或多个空格和逗号,用单个替换它们 空间。

如果清楚的话,请告诉我。