1

我正在尝试将所有特殊字符(包括空格、连字符等)替换为 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 值相同的结果。

4

2 回答 2

3

第二个版本更接近。通过将结果放入,$newVar您实际上是在设置一个名为任何存储在 中 $newVar的变量,也就是说,您必须通过 访问它$$newVar,可以这么说(在 Tcl 中无效)。无论如何,问题可能是在您的第二个版本中,您似乎没有逃避某些字符。试试这个:

regsub -all {[\s\-\]\[$^?+*()|\\%&#]} $varname "_" newVar

另一种组织它以最小化转义的方法是:

regsub -all {[][\s$^?+*()|\\%&#-]} $varname "_" newVar

而且,我不知道这是否太笼统,但你也可以试试这个:

regsub -all {\W} $varname "_" newVar
于 2012-10-01T21:55:49.120 回答
2

另一种解决方案是使用string map更简单的命令:string map 命令接受旧/新列表和字符串:

set varname [string map {% _ ( _ " " _} $varname]

在上面的例子中,为了简洁起见,我只用下划线替换了%、(、和空格“”。这个解决方案的缺点是旧/新列表可能有点长。优点是更容易理解。

于 2012-10-02T04:09:28.473 回答