String 获取TCL中两个字符串之间的不匹配部分

String 获取TCL中两个字符串之间的不匹配部分,string,tcl,String,Tcl,变量中有两个字符串,其中字符串的左半部分总是相同的。我需要得到最正确的部分: set cwd "/this/is/my/path" set full_file "/this/is/my/path/test.tcl" 我需要以下资料: "/test.tcl" Tcl具有出色的路径操作功能,它们可能会有帮助: set tail [file tail $full_file] 请注意,这将不包括前导/ 如果路径可能包含超过$cwd的其他元素,则可以使用 要删除前缀的正则表达式: regsub $c

变量中有两个字符串,其中字符串的左半部分总是相同的。我需要得到最正确的部分:

set cwd "/this/is/my/path"
set full_file "/this/is/my/path/test.tcl"
我需要以下资料:

"/test.tcl"

Tcl具有出色的路径操作功能,它们可能会有帮助:

set tail [file tail $full_file]
请注意,这将不包括前导/

如果路径可能包含超过
$cwd
的其他元素,则可以使用 要删除前缀的正则表达式:

regsub $cwd $full_file {} tail
puts $tail
如果
$cwd
包含任何特殊的 正则表达式识别的字符将失败 或者得到奇怪的结果。在这种情况下,您需要一个程序 要转义特殊字符,请执行以下操作:

proc escapeRegex { val } {
  regsub -all {([?*.+^${}()\\\[\]"])} $val {\\\1} val
  return $val
}
regsub [escapeRegex $cwd] $full_file {} tail
puts $tail

(此代码不处理前导字符。

我可以想出两种方法:

% set cwd "/this/is/my/path"
% set full_file "/this/is/my/path/test.tcl"

% string map [list $cwd ""] $full_file
/test.tcl

% string range $full_file [string length $cwd] end
/test.tcl
但第二种方法无法验证它们是否相同。
第一个未指定在字符串开头匹配

这两个注意事项都可以通过以下方式得到满足:

if {[string match "${cwd}*" $full_file]} { ... }

您是在寻找任意两个字符串的通用解决方案,还是专门针对文件路径?regex可以更简单:
regsub-all{[^\w\s]}$val{\\\&}
将转义任何非单词、非空格字符。并在替换中使用
&
,以使用匹配的文本。去掉尾部的varname,将返回新文本,这样您甚至不需要return语句。或者,使用将模式指定为文本。如果
设置x{foo.bar.*.baz};设置模式{.*}
然后将
regsub$pattern$x{--}
regsub“(?q)$pattern”$x{--}
@glennjackman;我正在寻找那个
(?q)
,但并不容易找到。这将是最好的方法,但它无法编译:“^(?q)/home/bll/stuff/”
string equal
命令使用了
-length
选项,这将比
字符串匹配
更安全(它具有一些可能令人惊讶的元字符)。或者,您可以先使用
字符串
,然后检查是否在字符串的开头找到。