我有这个字符串:
svpts-7-40.0001
我需要从中删除第二个“-”。基本上我正在获取这样的值,这些值有时会带有双“-”。因此,如果看到这样的变量,那么我必须删除第二个“-”并将其替换为“。” ,所以字符串应该是这样的:
svpts-7.40.0001
[编辑] 我试过:
% set list1 [split $string -]
svpts 7 40.0001
% set var2 [join $list1 .]
svpts.7.40.0001
%
这是一个仅更改第二个连字符的正则表达式:
% regsub -expanded {( .*? - .*? ) -} "svpts-7-40.0001" {\1.}
svpts-7.40.0001
% regsub -expanded {( .*? - .*? ) -} "svpts-7_40.0001" {\1.}
svpts-7_40.0001
% regsub -expanded {( .*? - .*? ) -} "svpts-7-40.0001-a-b-c" {\1.}
svpts-7.40.0001-a-b-c
尝试
% set data svpts-7-40.0001
svpts-7-40.0001
% regexp {([^-]*-)(.*)} $data -> a b
1
% set b [string map {- .} $b]
7.40.0001
% set newdata $a$b
svpts-7.40.0001
上面的代码在第一个连字符之后更改了每个连字符。要仅更改第二个连字符,可以这样做:
set idx [string first - $data [string first - $data]+1]
set newdata [string replace $data $idx $idx .]
或这个:
set idxs [lindex [regexp -inline -all -indices -- - $data] 1]
set newdata [string replace $data {*}$idxs .]
如果数据字符串不包含至少两个连字符,则第一个片段表现良好;另一个需要某种检查以避免引发错误。
文档: lindex、 regexp、 set、 string、 {*} (syntax)、 Tcl 正则表达式的语法
Tcl 索引表达式的语法:
end
最后一个元素end
-N最后一个元素之前的第n个元素end
+N最后一个元素之后的第n个元素(实际上,N应该是负数)表达式中不能有空格。