我正在尝试在{if loop}中使用regexp命令找到匹配的模式。仍然是TCL中的新手。代码如下所示:
set A 0;
set B 2;
set address "my_street[0]_block[2]_road";
if {[regexp {street\[$A\].*block\[$B\]} $address]} {
puts "the location is found"
}
我希望结果返回“找到位置”,因为$ address包含匹配的A和B变量。我希望能够更改$ address列表的A和B号。但我无法获得返回“找到位置”的结果。
谢谢。
答案 0 :(得分:1)
Tcl的正则表达式引擎不执行变量插值。 (应该吗?也许可以,但是不是。)这意味着您需要在通用级别执行此操作,这通常很烦人,但在这里还可以,因为变量仅包含数字,它们本身从来都不是RE元字符
基本版本(带有很多后退功能):
if {[regexp "street\\\[$A\\\].*block\\\[$B\\\]" $address]} {
带有format
的Nicer版本:
if {[regexp [format {street\[%d\].*block\[%d\]} $A $B] $address]} {
您也可以使用subst -nocommands -nobackslashes
,但这已经不那么优雅了。
如果您需要支持常规替换,只需使用regsub
进行保护即可。
proc protect {string} {
regsub -all {\W} $string {\\&}
}
# ...
if {[regexp [format {street\[%s\].*block\[%s\]} [protect $A] [protect $B]] $address]} {
当您知道要在RE中使用字母数字替换时,那就太过分了。