0

伙计们!我遇到了一个我自己无法解决的问题。

由于数字“08”和“09”不能像其他数字(01,02,03,04 等......)一样阅读,因此必须在语言Tcl中单独处理。

我找不到一种方法来删除所有 [我说 ALL 因为同一行上有多个] 前导零,除了右边的一个,它必须保持不变。

对于已经完全熟悉 Tcl/Tk 语言的人来说,这听起来很简单。但对于刚开始并正在寻找有关 Tcl / Tk 的更多信息的我来说,我在互联网上阅读了很多资料,包括这个https://stackoverflow.com/questions/2110864/handling-numbers-with-leading- zeros-in-tcl#2111822 所以没有什么可以告诉我如何在一次扫描中消除所有前导零。

我需要你给我这样的回报:2:9:10

我需要这个稍后使用expr[算术表达式] 命令来操作结果。

在此示例中,它仅删除了一个前导零:

set time {02:09:10}
puts [regsub {^0*(.+)} $time {\1}]
# Return: 2:09:10

谁能给我那个实力的朋友?!我现在很感激。

4

5 回答 5

1

scan命令可用于从该字符串中提取三个十进制数:

% set time {02:09:10}
02:09:10
% scan $time {%d:%d:%d} h m s
3
% puts [list $h $m $s]
2 9 10
于 2019-12-28T18:01:40.973 回答
1

通常,最好使用scan $str %d将带有可能前导零的十进制数转换为其实际值。

但在你的情况下,这也将起作用(对我来说似乎比之前给出的答案更简单,并且不依赖于分隔符是冒号):

regsub -all {0*(\d+)} $time {\1}

这将删除任意数量的前导零,但不会将 00 修剪为空字符串。尾随零也不会受到影响。

regsub -all {0*(\d+)} {0003:000:1000} {\1}=> 3:0:1000

于 2019-12-28T11:40:00.113 回答
1

您只匹配0字符串开头的 ,您还需要匹配每个字符串的开头:

puts [regsub -all {(^|:)0*([^:])} $time {\1\2}]
于 2019-12-28T02:14:52.063 回答
1

这里有一些棘手的边缘情况。具体来说,字符串02:09:10:1001:00覆盖了关键的(包括中间的零,只有零)。我们可以使用一个替换命令来完成这项工作:

regsub -all {\m0+(?=\d)} $str {}

(这使用了单词起始锚和前瞻约束。)

但是,我更倾向于使用其他工具来完成这类事情。例如,有时最好使用以下方法解析它们scan

set time "02:09:10"
scan $time "%d:%d:%d" h m s

或者,取决于发生了什么,clock scan(它也处理日期,使其在某些情况下更有用,而在其他情况下则更少)。

于 2019-12-28T18:08:24.860 回答
1

该组(^|:)匹配字符串的开头或冒号。0+ 匹配一个或多个零。替换为 group match \1,否则冒号会丢失。当然,用于-all在目标字符串中进行所有匹配。

% set z 02:09:10
02:09:10
% regsub -all {(^|:)0+} $z {\1} x
2
% puts $x
2:9:10
% 

编辑:正如 Barmar 指出的那样,这会将 :00 更改为空字符串。更好的正则表达式可能是:

regsub -all {(^|:)0} $z {\1} x

这只会删除一个前导 0。

于 2019-12-28T02:21:57.260 回答