需要从使用tcl的字母数字字符串中删除多个“ - ”

时间:2016-11-10 11:29:37

标签: tcl itcl

我有这个字符串:

svpts-7-40.0001

我需要删除第二个' - '。 基本上我正在获取这样的值,这些值会带有双倍' - 'SOMETIMES。因此,如果看到这样的变量,那么我必须删除第二个' - '并用'。'替换它。 ,所以字符串应如下所示:

svpts-7.40.0001

[编辑]我试过了:

% set list1 [split $string -]
svpts 7 40.0001
% set var2 [join $list1 .]
svpts.7.40.0001
%

2 个答案:

答案 0 :(得分:1)

这是一个正则表达式,只会改变第二个连字符:

% 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

答案 1 :(得分:0)

尝试

% 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 .]

如果数据字符串不包含至少两个连字符,则第一个代码段表现良好;另一方需要进行某种检查以避免抛出错误。

文档: lindexregexpsetstring{*} (syntax)Syntax of Tcl regular expressions

Tcl索引表达式的语法:

  • 整数从零开始的索引号
  • end最后一个元素
  • end -N 最后一个元素之前的 n 元素
  • end + N 最后一个元素之后的 n 元素(实际上, N 应为负数)
  • M-N 元素 m 之前的 n 元素
  • M + N 元素 m 之后的 n 元素

表达式中不能有空格。