我正在尝试编写一段非常简单的代码,而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
但两者都没有效果。发生了什么事?
答案 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"]
}