【问题标题】:tcl regsub will not worktcl regsub 将不起作用
【发布时间】:2013-08-04 18:21:17
【问题描述】:

我正在尝试编写一段极其简单的代码,但 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

但两者都不起作用。怎么回事??

【问题讨论】:

  • 当您说“适用于第二个表达式”时,您是指 substitution 过程中的第二个 regsub 调用还是您指的是 subsitution 方法的第二个调用?此外,在它“不起作用”的情况下,您会得到什么结果以及您期望什么?
  • 我想我的意思是两者。当我使用 puts "[substitution C:/projects] " 时,输出是 "//Path/projects",这就是我想要的。但是,当我使用 puts "[substitution /projects] " 时,输出是 "/projects",所以我想要的替换不会发生。

标签: regex tcl


【解决方案1】:

由于您的两个 regsub 调用不会更改输入字符串(即:$stringToSub),而是将结果放入函数返回的字符串$afterSub。您将始终获得最后一次regsub 调用的结果,而$aftersub 中的第一个regsub 调用的结果总是被覆盖。

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

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

【讨论】:

  • 为什么我们在{^.*?/projects} 中需要一个??无论如何.* 匹配零个或多个匹配项,对吗?据我了解,? 用于匹配前一个字符的 0/1 次出现。
  • .*? 将匹配切换为非贪婪。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    我们可以将代码简化为:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多