Regex 在Tcl中将变量传递给带有正则表达式的命令

Regex 在Tcl中将变量传递给带有正则表达式的命令,regex,parsing,arguments,tcl,parameter-passing,Regex,Parsing,Arguments,Tcl,Parameter Passing,我试图将变量传递给正则表达式,以便在字符串列表中循环时使用。例如,我有一个字符串,它是: top/inst/name[i],其中i可以取不同的整数值 for {set i 0} {$i < $rows} {set i [expr {$i + 1}]} { my_command { top/inst/name[$i] top_o/inst_o/name[$i] } } 对于{set i 0}{$i > +i i/代码>而不是 i=i+1/ C或C++(或许多其他语言)。问题是 [<

我试图将变量传递给正则表达式,以便在字符串列表中循环时使用。例如,我有一个字符串,它是:
top/inst/name[i]
,其中
i
可以取不同的整数值

for {set i 0} {$i < $rows} {set i [expr {$i + 1}]} {
    my_command { top/inst/name[$i] top_o/inst_o/name[$i] }
}
对于{set i 0}{$i<$rows}{set i[expr{$i+1}]}{
我的命令{top/inst/name[$i]top\u o/inst\u o/name[$i]}
}

如何告诉正则表达式解析器将
$I
视为一个数字?它抱怨
$i
是一个命令

问题在于,
[
..
]
在这里有两个不同的用途,一个在基本Tcl中用作命令替换语法,另一个用于正则表达式作为字符集语法。考虑到括号似乎是某事物实际名称的一部分,我不确定您是否需要其中任何一个。所以你需要小心

为避免命令替换,您可以在
[
]
之前插入
\
字符,也可以使用以下扩展功能:

为了避免另一个问题,您可以插入更多反斜杠(请注意,这会使事情在一段时间后变得难看),或者如果您确实在使用正则表达式来匹配文字(子)字符串,则可以在正则表达式前面加上
***=



对于循环迭代子句,在
中使用
incri
而不是
set i[expr{$i+1}]
。它也做同样的事情,但是对于(人类)读者来说,它更短更清晰。这就像使用了代码> > +i i/代码>而不是<代码> i=i+1/<代码> C或C++(或许多其他语言)。问题是<代码> [< /代码>…代码> > /Cuff>在这里有两个不同的用途,一个是在基TCL中作为命令替换语法,一个是正则表达式作为字符集语法。考虑到括号似乎是某事物实际名称的一部分,我不确定您是否需要其中任何一个。所以你需要小心

为避免命令替换,您可以在
[
]
之前插入
\
字符,也可以使用以下扩展功能:

为了避免另一个问题,您可以插入更多反斜杠(请注意,这会使事情在一段时间后变得难看),或者如果您确实在使用正则表达式来匹配文字(子)字符串,则可以在正则表达式前面加上
***=


对于
循环迭代子句,在
中使用
incri
而不是
set i[expr{$i+1}]
。它也做同样的事情,但是对于(人类)读者来说,它更短更清晰。这就像使用<代码> ++i i/COD>而不是<代码> i=I+1 < /Cord> C或C++(或许多其他语言)。

    my_command [subst -nocommands { top/inst/name[$i] top_o/inst_o/name[$i] }]