regexp函数行为使用字符串变量来定义表达式

时间:2013-06-15 20:36:58

标签: regex tcl

搜索文件内容以删除具有$ DEBUG字符的预编译指令之间的行。

搜索数据行的典型模式:

#IFDEF $DEBUG_MY_TEST
.... lines ...
#ENDIF


#IFDEF DEBUG_MY_issues for_sam
.... lines ...
#ENDIF

#IFDEF CMER for_max
.... lines ....
#ENDIF

此表达式测试有效:

if { [regexp -lineanchor -nocase -- {^[ \t]*#IFDEF[ \t]+[\$]?DEBUG.*} $oline_strpd ] == 1 } {
  set remove_to_cust_endif $oline_strpd; # sanity check
  continue;
}

我认为问题是在字符串变量模式中使用$字符。

使用此字符串变量方法进行搜索无效? :

set RE_STRNG [format "\{^\[ \\t\]*#IFDEF\[ \\t\]+\[\\$\]?DEBUG.*\}"]
if { [regexp -lineanchor -nocase -- $RE_STRNG $oline_strpd ] == 1 } {
  set remove_to_cust_endif $oline_strpd; # sanity check
  continue;
}

在代码的前一行中,使用此字符串变量方法正在运行:

set RE_STRNG [format "\{^\[ \\t\]*#IFDEF\[ \\t\]+CMER\[ \\t\]+%s\}" $is_cmer_name ]; # insert name into the search pattern
if { [regexp -lineanchor -nocase -- $RE_STRNG $oline_strpd ] == 1 && [llength $oline_strpd] == 3 } {
      set print_to_cust_endif $oline_strpd; # sanity check
      continue;
}

1 个答案:

答案 0 :(得分:0)

嗯,因为你没有任何替代品,你可以简单地把正则表达式本身。

这有效:

set RE_STRNG {^[ \t]*#IFDEF[ \t]+[\$]?DEBUG.*}
if { [regexp -lineanchor -nocase -- $RE_STRNG $oline_strpd ] == 1 } {
    set remove_to_cust_endif $oline_strpd; # sanity check
    continue;
}

或者,如果您想使用format,您仍然可以保留大括号:

set RE_STRNG [format {^[ \t]*#IFDEF[ \t]+[\$]?DEBUG.*}]
if { [regexp -lineanchor -nocase -- $RE_STRNG $oline_strpd ] == 1 } {
    set remove_to_cust_endif $oline_strpd; # sanity check
    continue;
}

我不确定它为什么不起作用,但以下工作:

set RE_STRNG [format "^\[ \\t\]*#IFDEF\[ \\t\]+\[\\$\]?DEBUG.*"]
if { [regexp -lineanchor -nocase -- $RE_STRNG $oline_strpd ] == 1 } {
    set remove_to_cust_endif $oline_strpd; # sanity check
    continue;
}

我测试了一些更有趣的内容,如果你在文件的某个地方插入[format "\{^\[ \\t\]*#IFDEF\[ \\t\]+\[\\$\]?DEBUG.*\}"]就行,并使用它:

set RE_STRNG [format "\{.*\}"]
if { [regexp -lineanchor -nocase -- $RE_STRNG $oline_strpd ] == 1 } {
    set remove_to_cust_endif $oline_strpd; # sanity check
    continue;
}

匹配的唯一一行就是你刚插入的那一行,这让我相信正则表达式试图匹配文本中的[format "{.*}"](格式)。所以我相信由于替换,Tcl在将它放入正则表达式之前执行命令format,而没有它,它会在正则表达式中使用format命令插入所有内容。