我试图从tcl中的字符串变量替换所有特殊字符,包括空格,连字符等,以下划线。
实施例
input: Stack Overflow helps%me(a lot output: Stack_Overflow_helps_me_a_lot
我在下面写了代码,但似乎没有用。
set varname $origVar
puts "Variable Name :>> $varname"
if {$varname != ""} {
regsub -all {[\s-\]\[$^?+*()|\\%&#]} $varname "_" $newVar
}
puts "New Variable :>> $newVar"
一个问题是,它不是替换$ varname中的字符串,而是在$ origVar而不是$ varname中遇到第一个空格后删除数据。此外,$ newVar中没有存储任何值。不知道为什么,我也读了我的tcl书中的示例代码(正确的语法),并根据它应该是这样的
regsub -all {[\s-][$^?+*()|\\%&#]} $varname "_" newVar
所以我使用相同的语法,但它不起作用,并给出与修改$ origVar而不是必需的$ varname值相同的结果。
答案 0 :(得分:3)
第二个版本更接近。通过将结果放在$newVar
中,您实际上正在设置一个名为 $newVar
中存储的任何变量,然后您必须访问它可以说是$$newVar
(在Tcl中无效)。无论如何,问题可能是在你的第二个版本中,你似乎没有逃避某些角色。试试这个:
regsub -all {[\s\-\]\[$^?+*()|\\%&#]} $varname "_" newVar
另一种组织方法以最大限度地减少逃避的方法是:
regsub -all {[][\s$^?+*()|\\%&#-]} $varname "_" newVar
而且,我不知道这是否过于笼统,但你也可以试试这个:
regsub -all {\W} $varname "_" newVar
答案 1 :(得分:2)
另一个解决方案是使用string map
命令,这更简单:字符串map命令接收旧/新列表和字符串:
set varname [string map {% _ ( _ " " _} $varname]
在上面的例子中,为了简洁起见,我只用下划线替换%,(和空格“”。这个解决方案的缺点是旧/新列表可能有点长。优点更容易理解。