这是我已分配给测试变量的行组
set test {tkt(pnr(
ticket(20140414,130559),
fbcode(y),
etkt(yes),
entry(price),
trap([flist,186,tkt1,bag],[start(1)]),
city(y)
])).}
我需要在“trap([flist,186,tkt1,bag]”中搜索“ trapremlist ”变量中的一些值列表。
set trapremlist {bag bagdisclosure bt}
如果
我想提取陷阱中的列表([]并使用lsearch删除值,如果它在trapremlist中。
但我无法在陷阱([]中找到列表并在解析后更新列表
你能告诉我最好的办法吗?
谢谢..
答案 0 :(得分:1)
“廉价黑客”方法是使用string map
:
set mapping {}
foreach value $trapremlist {
# Sneaky point: remove version with leading comma first
lappend mapping ",$value" "" $value ""
}
set removed [string map $mapping $test]
如果您在其他任何地方删除了删除列表中的任何字词,那么这将会彻底爆发。如果是这样的话,你必须解析和重建。幸运的是,在这种情况下,我们可以做到这一点:
set result {}
foreach line [split $test "\n"] {
if {[regexp {^(\s*trap\(\s*\[)([\w,]+)(\].*\)\s*),\s*$} $line -> a b c]} {
set b2 {}
foreach bit [split $b ","] {
if {$bit ni $trapremlist} {
lappend b2 $bit
}
}
set line $a[join $b2 ","]$c
}
lappend result $line
}
set removed [join $result "\n"]
如果你有一个真正的解析器工作(在tcllib中有一个解析器生成器引擎),你可以进行更全面的解析,但是如果像上面那样简单的东西就足够了,那就很多了。