0

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

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

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

4

1 回答 1

1

string toupper正在工作,但没有做你想做的事;string toupper "\\1"只是字符串\1,所以regsub没有太大影响。问题是regsub没有任何方法可以“在替换站点运行此命令”;多年来我一直想解决这个问题,但实际上从未这样做过(这个项目太多,无法脱颖而出)。

相反,您需要先将regsub命令替换为字符串,然后再替换subst结果,但为了做到这一点,您需要首先使字符串安全地substwith string 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 {\1}]}]

# Perform the substitution
set result [subst $withsubst]
于 2016-12-29T11:59:42.683 回答