1

我正在尝试编写一段非常简单的代码,而 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

但两者都没有工作。到底是怎么回事??

4

3 回答 3

1

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

我们可以将代码简化为:

proc substitution {stringToSub} {
    return [regsub {^.*?/projects} $stringToSub "//Path/projects"]
}
于 2013-08-04T10:21:17.363 回答
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
}
于 2013-08-04T01:09:07.037 回答
1

过程中的前两行实际上什么都不做,因为即使进行了 0 次匹配/替换,也regsub总是覆盖目标变量 ( )。afterSubregsub 手册

此命令将正则表达式expstring匹配,并将string复制到名称由varName给出的变量,或者如果varName不存在则返回string 。(正则表达式匹配在re_syntax参考页中描述。)如果匹配,则在将字符串复制到varName时(如果varName不存在,则复制到此命令的结果)匹配exp的字符串部分将替换为subSpec .

没有必要C:/projects专门匹配,因为^.*?/projects会匹配那个文本?

于 2013-08-04T05:35:19.027 回答