对tcl段落中的某一行应用regsub

时间:2015-05-04 13:48:10

标签: tcl

这是我已分配给测试变量的行组

    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}

如果 trapremlist 中的任何值出现在“trap([flist,186,tkt1,bag]”中。那么我需要删除它。在这种情况下我需要删除“bag ”

我想提取陷阱中的列表([]并使用lsearch删除值,如果它在trapremlist中。

但我无法在陷阱([]中找到列表并在解析后更新列表

你能告诉我最好的办法吗?

谢谢..

1 个答案:

答案 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中有一个解析器生成器引擎),你可以进行更全面的解析,但是如果像上面那样简单的东西就足够了,那就很多了。