3

我有一个列表,我正在尝试修改并根据我想要实现的目标制作一个新列表。

原始清单

$> set a {123.4:xyz 123.4:pqr 123.4:xyz 123.4:abc 123.4:mno}
$> puts $a
$> 123.4:xyz 123.4:pqr 123.4:xyz 123.4:abc 123.4:mno

我希望我的新列表包含以下元素

$> puts $a
$> xyz pqr xyz abc mno

我试过split $a :了,但对我没有用。请建议可以做什么。

4

7 回答 7

2

如果你有 Tcl 8.6:

set a [lmap x $x {regsub {^[^:]*:} $x ""}]

在 8.5 中,如果存储在另一个变量中会更容易:

set b {}
foreach x $a {
    lappend b [regsub {^[^:]*:} $x ""]
}

在 8.4 及之前的版本中,您还需要稍微不同的语法regsub

set b {}
foreach x $a {
    # Mandatory write back to a variable...
    regsub {^[^:]*:} $x "" x
    # Store the value; it isn't reflected back into the source list by [foreach]
    lappend b $x
}
于 2013-09-19T23:02:14.417 回答
2
set b [list]
foreach item $a {
    catch { 
        regexp {\:(.*)} $item match tail 
        lappend b $tail
    }
}
puts $b

上面可以用 split 而不是 regexp 来做;我更喜欢正则表达式,因为您可以通过这种方式提取任意模式。

于 2013-09-19T23:04:19.737 回答
2

一个班轮:

% set a {123.4:xyz 123.4:pqr 123.4:xyz 123.4:abc 123.4:mno}
% 123.4:xyz 123.4:pqr 123.4:xyz 123.4:abc 123.4:mno
set b [regexp -inline -all {[a-z]+} $a]
% xyz pqr xyz abc mno

Taddaaaa ...如果您有正则表达式,则无需拆分。

于 2013-09-20T10:44:56.427 回答
1
set a {123.4:xyz 123.4:pqr 123.4:xyz 123.4:abc 123.4:mno}
for {set i 0} {$i < [llength $a]} {incr i} {
  lset a $i [lindex [split [lindex $a $i] ":"] 1]
}
puts $a
于 2013-09-20T01:04:52.813 回答
0
set input {123.4:xyz 123.4:pqr 123.4:xyz 123.4:abc 123.4:mno}
set a ""

for {set i 0} {$i<[llength $input]} {incr i} {

        set a "$a [string trim [lindex $input $i] {0,1,2,3,4,5,6,7,8,9,.,:}]"
}

这将修剪输入。

于 2013-09-20T04:33:47.740 回答
0

如果你有 8.5 和 tcllib:

struct::list map $a {apply {{elem} {lindex [split $elem :] end}}}
于 2013-09-20T23:24:14.983 回答
0

通过使用 split 命令:

set a { 123.4:xyz 123.4:pqr 123.4:xyz 123.4:abc 123.4 :mno }
set c [list]
foreach ele $a {
    lappend c [lindex [split $ele ":"] 1]
} 
puts $c

输出:xyz pqr xyz abc mno

于 2013-10-03T06:44:57.333 回答