字符串替换正则表达式在tcl中不起作用

时间:2012-10-01 21:35:19

标签: regex tcl

我试图从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值相同的结果。

2 个答案:

答案 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]

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