-1

搜索文件内容以删除具有 $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;
}
4

1 回答 1

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放入正则表达式之前执行命令,而没有它,它会在正则表达式中插入带有格式命令的全部内容。

于 2013-06-16T14:39:54.037 回答