Tcl 删除字符串后的所有字符而不删除字符串

Tcl Remove all characters after a string without removing the string

tcl中有没有办法trim输出指定字符串后的所有字符?我已经看到很多关于删除所有内容并包括字符串的帖子,但不是我希望做的。我有一个脚本可以搜索后缀为 .sv 的文件名,但其中一些是 .sv.**bunch of random stuff**。而且我不需要随机的东西,因为它与我无关。

我尝试过不同的 regsubstring trim 命令,但它们总是删除 .sv

附加到列表的结果类似于以下内容...

test_module_1.sv.random_stuff
test_module_2.sv.random_stuff
test_module_3.sv.random_stuff
test_module_4.sv.random_stuff
test_module_5.sv.random_stuff

等等等等

当您使用 regsub 时,您可以放置​​正则表达式模式的匹配部分。一个例子:

regsub {(\.sv).*} $str {} new

将删除 .sv 及其后的任何内容(如果有)并将其替换为第一个匹配的组,即括号之间的部分,或者在本例中为 .sv 以便输入 example.sv.random 将变为 example.sv.

但是,您也可以像这样轻松地替换为 .sv

regsub {\.sv.*} $str {.sv} new

或者另一种不涉及替换的方法是获取字符串的一部分直到 .sv 部分:

string range $str 0 [expr {[string first ".sv" $str]+2}]

这里[string first ".sv" $str]获取.sv在字符串中的位置(如果有多个就取第一个),在[=24=之后添加2个字符(sv ] 是 2 个字符),string range 获取所有字符,包括 .sv.

或者如果您想坚持使用正则表达式:

regexp {.+?\.sv} $str match

$match 将包含结果字符串。使用的表达式抓取所有字符,包括 .sv.