tcl 字符串命令不适用于正则表达式反向引用

tcl string command does not work with regexp backreference

请参阅下面的代码,例如,我试图找到使用 regsub 和 backrefeence 作为选择性使用 string toupper 的方法。我没有得到我所期望的。
请参阅下面的简单示例(是的,我知道我可以使用 string toupper $string 0 0,但是,这只是为了展示原理,在一个简单的示例中)。

> puts [ regsub {^(.)} "min" "s\1" ]
smin
> puts [ regsub {^(.)} "min" [ string toupper "\1" ] ]
min

可以看出,字符串toupper应用于反向引用不起作用,但反向引用可以用于双引号操作。
我正在使用 TCL 版本。 8.6

string toupper 正在工作,但没有按照您的要求进行; string toupper "\1" 只是字符串 </code> 所以 <code>regsub 没有太大影响。问题是 regsub 没有任何方法可以执行“运行 在替换站点执行此命令”;多年来我一直想解决这个问题,但从未真正这样做过(这个项目太多了,无法脱颖而出)。

相反,您需要 regsub 在命令中替换为字符串,然后 subst 结果,但为了做到这一点,您需要首先使字符串安全 subststring map。幸运的是,这其实很简单。

我将其分开是为了让您更容易准确地检查每个阶段在做什么:

set str "here is an example with $dollars, \[brackets\] and \backslashes"

# Quote all of Tcl's metacharacters; there's not that many
set safer [string map {[ \[ ] \] \ \\ $ \$} $str]

# Inject the command we want to run where we want to run it
set withsubst [regsub {^(.)} $safer {[string toupper {}]}]

# Perform the substitution
set result [subst $withsubst]