Tcl - 将大括号传递到 regsub 命令中的变量

Tcl - passing curly braces into a variable within a regsub command

我需要在 regsub 命令中将正则表达式作为变量传递。我想从 cap 变量中删除括号,但我无法在 match 变量中传递大括号。

set cap {[equality choice control]}
set match {\[}
regsub -all $match $cap "" cap
puts $cap

这样做的原因是我正在构建一个 proc 并且我需要将正则表达式作为参数传递。

方括号在正则表达式和 Tcl 中都是特殊的。要匹配文字括号,您需要在正则表达式中将其转义,并且需要在 Tcl 中单独转义。

% set match {[}
[
% regsub -all $match $cap ""
couldn't compile regular expression pattern: brackets [] not balanced

% set match {\[}
\[
% regsub -all $match $cap ""
equality choice control]

您也可以使用引号,但要确保处理 Tcl 转义要求。即:set match "\\["

注意:对于简单的替换,您可能会发现 string map 更易于使用:

set cap [string map [list "\[" ""] $cap]

会达到同样的效果。