预计Tcl模式匹配失败

时间:2016-09-08 14:22:11

标签: unix tcl expect

我是Expect和Tcl的新手。我正在使用Tcl中的expect编写一个代码来单独匹配一个模式(即没有模式是给定字符串中的子字符串).Code如下:

 package require Expect
 expect  "^hi$" { send "pattern matched" }; # hi is the pattern to be matched

但是代码没有检测到你好。如果代码被修改如下,当模式出现在字符串的第一部分

时,它就会起作用
 package require Expect
 expect  "^hi" { send "pattern matched" }

如果代码修改如下,即使预期与字符串末尾的模式匹配,它也无法正常工作

 package require Expect
 expect  "hi$" { send "pattern matched" }

我做错了吗?请帮忙

2 个答案:

答案 0 :(得分:0)

这确实有点神秘。

$是字符串锚点的结尾,看起来在字符串结尾之前捕获了行尾。考虑到这一点,你可以用:

expect "Hi\n$" { puts "Wow" }

请注意\n正在使用linux,但可能不适用于其他控制台类型!

答案 1 :(得分:0)

有些事情可能会出错,但最有可能的选择是在您期待的文本之后会出现某种额外的空格;期待所有字符,而不仅仅是可打印的字符。它可能是一个空间,它可能是一个换行符。如果您知道它是什么,请将其添加到您期望的内容中。否则,您需要一个更复杂的正则表达式:

# RE in braces because of the backslash; \s matches *ALL* types of whitespace
expect {^hi\s*$}
send "found it!"

另一种选择是切换RE匹配模式。默认情况下,Expect以全缓冲模式运行(它是最复杂场景中唯一合理的选项),但您可以将其置于面向行的模式中:

# The ‘n’ is mnemonically for Newline-aware
expect {(?n)^hi$}
send "found it!"