在带有方括号和 tcl 中的变量的字符串上使用 regsub 问题

Issue with regsub on a string with square brackets with variables in tcl

我无法在具有方括号且变量定义为索引的字符串上使用当前正则表达式替换模式。

我已经按照代码中的描述尝试了以下方法

set p "not r\[0\]"
set bit 0
set value 1
set x [regsub -all {r\[$bit\]} $p $value] 

预期结果是 x = "not 1" 输出 = 0

没有替换的原因是因为你的表达式试图匹配文字字符串 r[,然后是 $,这意味着 'end of line',然后是文字字符串 bit]。要允许替换变量,您必须使用双引号,但这意味着您必须更加小心转义,因为有了它,您现在必须双重转义(一个转义反斜杠,另一个转义方括号):

set p "not r\[0\]"
set bit 0
set value 1
set x [regsub -all "r\\[$bit\\]" $p $value] 

以上给你not 1.

一些不太常见的解决方案我想是尝试使用 format 来执行替换:

set x [regsub -all [format {r\[%s\]} $bit] $p $value] 

或者带双引号的 Tcl 的 string literal metacharacter (***=):

set x [regsub -all "***=r\[$bit\]" $p $value]