Tcl字符串映射:如何映射到开括号

时间:2015-01-23 10:10:56

标签: regex string tcl

我希望catch "转换为newcatch {。我尝试了以下方法:

% string map { {catch "} {newcatch \{} } {catch "}
newcatch \{

我想在输出中newcatch {。请建议我如何做到这一点。如果您找到其他方法,请考虑如何以最小的修改采取上述方法。另外,为什么不必转义"(如果我转义它在提供的字符串中不匹配。

2 个答案:

答案 0 :(得分:2)

puts [ string map { {catch "} newcatch\ \{ } {catch "}] 

除了在匹配字符串中转义文字括号外,我也逃脱了空格字符。即newcatch\ \{

代码可以写成

puts [ string map { catch\ \" newcatch\ \{ } {catch "}] 

更新 这不是必要的。这是由于您想要的输出。

string map的语法如下,

string map ?-nocase? mapping string

暂时忘记-nocase标志。为简单起见,可以写成,

string map <key1 value1 key2 value2 ... > <target-string>

键值对集可以在双引号的帮助下编写,也可以用空格分隔。不同之处在于,使用大括号,替换根本不会发生,并且将使用字面值来处理。

即。它可以是"foo bar hello world"{foo bar hello world}

您的主要要求是映射文字大括号。请考虑以下示例

puts "{"
puts {\{}

虽然前者将精确地生成文字支撑,但后来会打印括号和反斜杠。即\{这是因为,当在括号内进行转义时,它将按字面意思进行。

同样的逻辑也适用于string map命令。由于您需要与{匹配。

更新2:

先试试这个。

puts {{}}

将输出为{}puts {{}失败的原因是因为它不平衡。 Tcl会认为你已经在{内打开了一个左括号{},并且因为在括号之间使用了它,所以还需要一个左括号。如前所述,puts "{"有效,因为它不是用大括号来解释,而是用双引号来解释。

回到我们的故事。为了使Tcl将左括号解释为文字括号,我们使用反斜杠作为\{进行转义。

现在,还有一个规则开始了。使用大括号,替换不会发生,它将被视为文字值,我之前已经引用过,{{1}按字面意思打印为\{。 :)

更新3:

我们正在谈论这个话题。不是吗?无论如何,让我试试。

首先,为了逃避左支撑,我们在前面加上反斜杠。这可以防止tcl抛出\{消息。

正如我们所知,无论是在牙箍中存在什么,都可以如此处理/印刷。

我们有什么?只有1个}}。这就是它按原样打印的原因。

坦率地说,如果Mr.Donal Fellows看到这篇文章,他可以作一个快速的讲座作为答案。:)

答案 1 :(得分:0)

用双引号读取映射器可能更容易。

catch.tcl

#!/usr/bin/tclsh
set mapper { "catch \"" "newcatch \{" }
set mapped [string map $mapper {catch "}]
puts $mapped

输出:

./catch.tcl
newcatch {