我有一个列表,我试图修改并根据我想要实现的目标制作一个新列表。
原始列表
$> 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 :
,但这对我没用。请建议可以做些什么。
答案 0 :(得分: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
}
答案 1 :(得分:2)
set b [list]
foreach item $a {
catch {
regexp {\:(.*)} $item match tail
lappend b $tail
}
}
puts $b
上面可以用split而不是regexp来做;我更喜欢正则表达式,因为你可以通过这种方式提取任意模式。
答案 2 :(得分: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 ......如果你有正则表达式,则不需要拆分。
答案 3 :(得分: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
答案 4 :(得分: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,.,:}]"
}
这将修剪输入。
答案 5 :(得分:0)
如果你有8.5和tcllib:
struct::list map $a {apply {{elem} {lindex [split $elem :] end}}}
答案 6 :(得分: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