正则表达式中的交替不工作(使用管道符号|)将值类型归零

时间:2014-04-28 18:00:00

标签: regex tcl matching

我做了一点阅读并实现了管道符号|匹配时可以像“或”逻辑一样使用。我已经尝试将其合并到我的以下代码中,但它不能用于执行regexp之后的一些文本处理(请参阅文件格式下面的代码段代码)。首先,这是我的文件类型(芯片设计中使用的.lib)

pin (d) {
  direction : input;
  nextstate_type : data;
  related_ground_pin : vss;
  related_power_pin : vcc;
  max_transition : 0.4;
  capacitance : 0.000719782;
  rise_capacitance : 0.000719782;
  rise_capacitance_range (0.000462301, 0.000719782);
  fall_capacitance : 0.000569233;
  fall_capacitance_range (0.000459043, 0.000569233);
  timing () {
    related_pin : "clk";
    timing_type : setup_rising;
    rise_constraint (constraint_template_5X5) {
      index_1 ("0.01, 0.05, 0.12, 0.2, 0.4");
      index_2 ("0.005, 0.025, 0.06, 0.1, 0.3");
      index_3 ("0.084, 0.84, 3.36, 8.4, 13.44") ;
      values ( \
        "5.1,1.2,1.3,1.4,1.5", \
        "9.1,2.2,2.3,2.4,2.5", \
        "3.1,3.2,3.3,3.4,3.5", \
        "4.1,4.2,4.3,4.4,4.5", \
        "5.1,5.2,5.3,5.4,5.5", \
        "6.1,6.2,6.3,6.4,6.5", \
        "7.1,7.2,7.3,7.4,7.5", \
        "8.1,8.2,8.3,8.4,8.5", \
        "9.1,9.2,9.3,9.4,9.5", \
        "10.1,10.2,10.3,10.4,10.5", \
        "11.1,11.2,11.3,11.4,11.5", \
        "12.1,12.2,12.3,12.4,12.5", \
        "13.1,13.2,13.3,13.4,13.5", \
        "14.1,14.2,14.3,14.4,14.5", \
        "15.1,15.2,15.3,15.4,15.5", \
        "16.1,16.2,16.3,16.4,16.5", \
        "17.1,17.2,17.3,17.4,17.5", \
        "18.1,18.2,18.3,18.4,18.5", \
        "19.1,19.2,19.3,19.4,19.5", \
        "20.1,20.2,20.3,20.4,20.5", \
        "21.1,21.2,21.3,21.4,21.5", \
        "22.1,22.2,22.3,22.4,22.5", \
        "23.1,23.2,23.3,23.4,23.5", \
        "24.1,24.2,24.3,24.4,24.5", \
        "25.1,25.2,25.3,25.4,25.5", \
      );
    }
    fall_constraint (constraint_template_5X5) {
      index_1 ("0.01, 0.05, 0.12, 0.2, 0.4");
      index_2 ("0.005, 0.025, 0.06, 0.1, 0.3");
      index_3 ("0.084, 0.84, 3.36, 8.4, 13.44") ;
      values ( \
        "1.1,1.2,1.3,1.4,1.5", \
        "2.1,2.2,2.3,2.4,2.5", \
        "3.1,3.2,3.3,3.4,3.5", \
        "4.1,4.2,4.3,4.4,4.5", \
        "5.1,5.2,5.3,5.4,5.5", \
        "6.1,6.2,6.3,6.4,6.5", \
        "7.1,7.2,7.3,7.4,7.5", \
        "8.1,8.2,8.3,8.4,8.5", \
        "9.1,9.2,9.3,9.4,9.5", \
        "10.1,10.2,10.3,10.4,10.5", \
        "11.1,11.2,11.3,11.4,11.5", \
        "12.1,12.2,12.3,12.4,12.5", \
        "13.1,13.2,13.3,13.4,13.5", \
        "14.1,14.2,14.3,14.4,14.5", \
        "15.1,15.2,15.3,15.4,15.5", \
        "16.1,16.2,16.3,16.4,16.5", \
        "17.1,17.2,17.3,17.4,17.5", \
        "18.1,18.2,18.3,18.4,18.5", \
        "19.1,19.2,19.3,19.4,19.5", \
        "20.1,20.2,20.3,20.4,20.5", \
        "21.1,21.2,21.3,21.4,21.5", \
        "22.1,22.2,22.3,22.4,22.5", \
        "23.1,23.2,23.3,23.4,23.5", \
        "24.1,24.2,24.3,24.4,24.5", \
        "25.1,25.2,25.3,25.4,25.5", \
      );
    }
  }
}

好的,所以我必须进行一些文本处理(由Brad Lanam帮助 - SO的用户),其操作如下。这段代码的目的是将正确类型的约束(在我的.lib中)归零以进行文本处理。

set inFile [open "C:/Tcl/official/ref.lib" r]

set inval false
set foundValues 0
set found_setup 0
set found_fall 0
set extract1 0
set extract2 0
set DETECT_END_SYNTAX {\);}

while { [gets $inFile line] >= 0 } {

  if { [regexp {setup_rising;} $line] } { set found_setup 1 }
  if { [regexp {hold_rising;} $line] } { set found_setup 0 }

  if { $found_setup } {

    if { [regexp {rise_constraint|fall_constraint} $line] } { set found_fall 1 }
    if { $found_fall } {

      if {[regexp {values} $line]} {
        set foundValues 1
      }
      if {$foundValues} {
        if { [regexp $DETECT_END_SYNTAX $line] } {
          if { $inval } {
            set inval false
            set foundValues 0
            set found_fall 0
          }
        }
      }
    }
  }
}

# { Do text processing after this }

但是

if { [regexp {rise_constraint|fall_constraint} $line] } 
# Does NOT work 

匹配rise_constraintfall_constraint以执行某些regsub命令。我的代码只会在写出的修改后的文件中处理rise_constraint的值。我需要更改两种约束类型的值。我在正则表达式中做错了吗?谢谢!

我应该这样做:

if { [regexp {rise_constraint} $line] } { set found_fall 1 }
if { [regexp {fall_constraint} $line] } { set found_fall 1 }

而不是:

if { [regexp {rise_constraint|fall_constraint} $line] } { set found_fall 1 }

注意:found_fall实际上甚至会找到rise_constraint值,它只是一个变量。

参考:tcl text processing - rearrange values in rows and columns based on user defined value

1 个答案:

答案 0 :(得分:0)

if { [regexp {rise_constraints|fall_constraint} $line] } 

不起作用,因为行中没有rise_constraintsrise_constraint没有s

另外,请尝试下次更好地缩进代码。