如何在tcl中的字符串映射中使用左大括号和右大括号

How to use left curly bracket and right curly bracket in string map in tcl

我正在尝试在我的脚本中使用字符串映射函数。我有一个属性,其值如下所示:

{{1234||}{2345||}}

我想用空白字符和 ||} 替换所有左大括号 逗号,。如何使用地图功能?

如何转义上面的大括号?

如果要替换字符串的一部分,最好的解决方案是使用 regsub

set str {{1234||}{2345||}}
regsub -all {\{} $str "" str
regsub -all {\|\|\}} $str "," str
puts $str

manual应该说的很清楚了,但以防万一...

set s "{{1234||}{2345||}}"
set result [string map {"{" "" "||}" ","} $s]
puts $result
# 1234,2345,}

string map 接受一个包含一对字符串的列表。在该列表中从左到右的每一对中,第一个将被第二个替换。

因此在上面,首先{会被替换为空格,完成后,||}会被,替换。我使用引号是因为大括号在 Tcl 中用于引用,如果您不太习惯 Tcl 中引用机制的工作方式,它可能并不总是如您所愿。


虽然我不太确定上面是不是你要找的结果?如果你想删除额外的 ,},你可以使用 string trimright,这将删除所有尾随字符 ,}:

string trimright $result ",}"
# 1234,2345

另请注意,您使用反斜杠 (\) 在 Tcl 中转义字符。

您始终可以使用 list(或其他列表操作)来构建映射项。这是使用交互式终端工作的好时机。

% list "{" "" "||}" ","
\{ {} ||\} ,

现在我们知道文字列表长什么样了,我们可以在脚本中使用它了:

set s "{{1234||}{2345||}}"
set result [string map {\{ {} ||\} ,} $s]
puts "“$s” --> “$result”"
# “{{1234||}{2345||}}” --> “1234,2345,}”

当然,这可能是您告诉我们引用的输入值:

set s {{1234||}{2345||}}
set result [string map {\{ {} ||\} ,} $s]
puts "“$s” --> “$result”"
# “{1234||}{2345||}” --> “1234,2345,”

(Unicode 引号可用于在测试时分隔输出字符串,因为它们不会被误认为是输入值。)