regexp tcl搜索变量

时间:2019-01-29 14:26:17

标签: regex tcl

我正在尝试在{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号。但我无法获得返回“找到位置”的结果。

谢谢。

1 个答案:

答案 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中使用字母数字替换时,那就太过分了。