Tcl 如何在右括号后匹配冒号

Tcl 如何在右括号后匹配冒号,tcl,expect,Tcl,Expect,为什么以下内容与以下内容不匹配: expect { timeout {puts timedout\n} \[1\]: {puts matched\n} } > expect test.tcl [1]: timedout 如果我更改它并删除冒号,则匹配有效: 期待{ 超时{puts timedout\n} \[1\]{puts匹配\n} } $expect test.tcl [1] 匹配 或者如果我去掉第一个括号 期待{ 超时{puts timedout\n}

为什么以下内容与以下内容不匹配:

expect {
    timeout {puts timedout\n}
    \[1\]: {puts matched\n}
}


> expect test.tcl
[1]:
timedout
如果我更改它并删除冒号,则匹配有效:


期待{
超时{puts timedout\n}
\[1\]{puts匹配\n}
}


$expect test.tcl
[1]
匹配

或者如果我去掉第一个括号


期待{
超时{puts timedout\n}
1\]:{puts匹配\n}
}
然后它匹配:


$expect test.tcl
1]:
匹配

这不是
的问题,而是
[
的问题

[
对于
Tcl
Expect
模式匹配器都是特殊的,因此它特别混乱。要匹配文本
[
,您必须从
Tcl
反斜杠一次,然后再反斜杠一次,以便在模式匹配过程中不将其视为范围。当然,第一个反斜杠必须反斜杠,以防止它将下一个反斜杠变成文字反斜杠

expect "\\\[" ; #matches literal '['
所以,你的代码应该是

expect {
    timeout {puts timedout\n}
    \\\[1]: {puts matched\n}
}
如果感觉良好,可以在
]
前面加反斜杠,但事实并非如此 必要的。因为在系统中没有匹配的左侧支架 双引号字符串,右括号中没有任何特殊情况。它代表它自己,并被传递到
Expect
命令,然后被解释为范围的结束

下一组示例将
[
的行为显示为前面有不同数量反斜杠的模式[前面没有反斜杠,
Tcl
将以下内容解释为命令。对于这些示例,假设有一个名为
XY
的过程返回字符串
n*w

expect" [XY]" ; # matches n followed by anything
expect "\[XY]" ; # matches X or Y
expect "\\[XY]" ; # matches n followed by anything followed by w
expect "\\\[XY]" ; # matches [XYl
expect "\\\\[XY]" ; # matches \ followed by n followed ...
expect "\\\\\[XY]" ; # matches sequence of \ and X or Y
\\[XY]
案例值得仔细检查。
Tcl
将第一个反斜杠解释为第二个是文字字符。
Tcl
然后作为XY命令的结果生成
n*w
。模式匹配器最终会看到四个字符的字符串
n*w
。模式匹配器以通常的方式对此进行解释。反斜杠表示要逐字匹配
n
(即使没有反斜杠,它也会这样做,因为n对于模式匹配器来说并不特殊)


来源

对我有效的模式:

  • -精确的{[1]:}
  • -精确的“\[1]:”
  • {\[1]:}
  • “\\[1]:”

谢谢。我不知道工作中有两个间接层次。我只希望有一个。。。