tcl regsub不起作用

时间:2013-08-03 23:17:15

标签: regex tcl

我正在尝试编写一段非常简单的代码,而tcl却没有合作。我只能想象我的代码中缺少一个非常简单的错误,但我完全不知道它可能是什么,请帮助我很沮丧!!

我的代码如下......

proc substitution {stringToSub} {
   set afterSub $stringToSub
   regsub {^.*?/projects} "$stringToSub" "//Path/projects" afterSub
   regsub {C:/projects} "$stringToSub" "//Path/projects" afterSub
   return $afterSub
}

puts "[substitution /projects] "
puts "[substitution C:/projects] "

替换适用于第二个表达式,但不适用于第一个表达式。这是为什么?? 我也尝试过使用

regsub {^/projects} "$stringToSub" "//Path/projects" afterSub

regsub {/projects} "$stringToSub" "//Path/projects" afterSub

但两者都没有效果。发生了什么事?

3 个答案:

答案 0 :(得分:1)

由于你的两个regsub调用不改变输入字符串(即:$stringToSub),而是将结果放在函数返回的字符串$afterSub中。您将始终获得上一次regsub来电的结果,并且始终会覆盖regsub中第一个$aftersub来电的结果。

请注意,第一个模式更通用,包括与第二个匹配的所有字符串(假设$stringToSub始终是路径)。如果您希望获得示例字符串的"//Path/projects",则只需删除第二个regsub调用:

proc substitution {stringToSub} {
    set afterSub $stringToSub
    regsub {^.*?/projects} "$stringToSub" "//Path/projects" afterSub
    return $afterSub
}

答案 1 :(得分:1)

您的过程中的前两行将无效地执行任何操作,因为regsub始终会覆盖目标变量(afterSub),即使在进行了0次匹配/替换时也是如此。来自regsub manual

  

此命令将正则表达式 exp string 匹配,并将 string 复制到名称由 varName给出的变量,如果 varName 不存在,则返回 string 。 (正确的表达式匹配在 re_syntax 参考页中进行了描述。)如果匹配,则将 string 复制到 varName (如果 varName 不存在,则返回此命令的结果)匹配 exp string 部分将替换为 subSpec < / em>的

没有必要专门匹配C:/projects,因为^.*?/projects会匹配该文字吗?

答案 2 :(得分:1)

问题是您第二次使用regsub操作会覆盖第一次regsub使用的替换值。

我们可以将代码简化为:

proc substitution {stringToSub} {
    return [regsub {^.*?/projects} $stringToSub "//Path/projects"]
}