从字符串中删除双重引号

问题描述 投票:0回答:2

我有一句话:

{"a/b"} {"c/d"} {"e/f"}

我希望输出为:

a/b c/d e/f

基本上我想从现有行中删除所有“和{}。

我应该怎么做TCL?

我尝试过使用string trim但没有帮助。

set z {{"a/b"} {"c/d"} {"e/f"}}
set trimmed_z [string trim $z "\"\"\}\{"]

它给

a/b"} {"c/d"} {"e/f
tcl trim
2个回答
2
投票

由于元素中的"字符,这看起来像一个Tcl列表,其中内括号。因此,我们需要做的就是对每个元素应用一个剥离命令(一个相当简单的string trim); lmap让这很容易:

set yourData {{"a/b"} {"c/d"} {"e/f"}}
set yourCleanData [lmap elem $yourData {
    string trim $elem \"
}]

1
投票

string trim只会删除字符串末端的字符,即仅在开头和结尾处删除字符。你可以使用string map

set z {{"a/b"} {"c/d"} {"e/f"}}
set clean_z [string map {\" "" \{ "" \} ""} $z]
# a/b c/d e/f

否则,因为该行看起来像一个Tcl列表,您可以使用lmap(Tcl 8.6+)来获取“子列表的最内层元素”:

set clean_z [lmap x $z {set x [lindex $x 0]}]
# a/b c/d e/f

还有其他方法可以做到这一点;也许是循环和string trim(这里我们只需要删除引号,因为这里的括号似乎充当引用机制):

set z {{"a/b"} {"c/d"} {"e/f"}}
set cleaned_z ""
foreach n $z {
    lappend cleaned_z [string trim $n \"]
}
puts $cleaned_z
# a/b c/d e/f

或者struct::list flatten

package require struct
set z {{"a/b"} {"c/d"} {"e/f"}}
set cleaned_z [struct::list flatten $z]
# a/b c/d e/f

或者,如果你喜欢使用regsub的一些正则表达式:

set z {{"a/b"} {"c/d"} {"e/f"}}
# I'm only escaping the quote so the syntax highlighting doesn't break, but it's not
# necessary
set cleaned_z [regsub -all {[\"{}]} $z ""]
# a/b c/d e/f
© www.soinside.com 2019 - 2024. All rights reserved.