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
结果,但为了做到这一点,您需要首先使字符串安全 subst
与 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 {}]}]
# Perform the substitution
set result [subst $withsubst]
请参阅下面的代码,例如,我试图找到使用 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
结果,但为了做到这一点,您需要首先使字符串安全 subst
与 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 {}]}]
# Perform the substitution
set result [subst $withsubst]