【问题标题】:need to remove multiple "-" from the string which is alpha numeric using tcl需要使用 tcl 从字母数字字符串中删除多个“-”
【发布时间】:2016-11-10 11:29:37
【问题描述】:

我有这个字符串:

svpts-7-40.0001

我需要从中删除第二个“-”。 基本上我正在获取这样的值,这些值有时会带有双“-”。因此,如果看到这样的变量,那么我必须删除第二个“-”并将其替换为“。” ,所以字符串应该是这样的:

svpts-7.40.0001

[编辑] 我试过了:

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

【问题讨论】:

  • 尝试拆分和加入:% set list1 [split $string -] svpts 7 40.0001 % set var2 [join $list1 .] svpts.7.40.0001 % 但加入基于 .对于所有项目,它只发生在第二个连字符(-)@Jolta
  • '需要删除多个“-”'——这是否意味着在某些情况下您需要删除多个连字符?

标签: tcl itcl


【解决方案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

【讨论】:

  • 这有助于优化、最昂贵的操作,但仍然获得完美的输出,感谢 glenn
【解决方案2】:

试试

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

如果数据字符串不包含至少两个连字符,则第一个 sn-p 表现良好;另一个需要某种检查以避免引发错误。

文档: lindex, regexp, set, string, {*} (syntax), Syntax of Tcl regular expressions

Tcl 索引表达式的语法:

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

表达式中不能有空格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    相关资源
    最近更新 更多