【问题标题】:Expect Tcl pattern match failure预期 Tcl 模式匹配失败
【发布时间】:2016-09-08 14:22:10
【问题描述】:

我是 Expect 和 Tcl 的新手。我正在使用 Tcl 中的期望编写代码来单独匹配模式(即模式不是给定字符串中的子字符串)。代码如下:

 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" }

我做错了吗?请帮忙

【问题讨论】:

    标签: unix tcl expect


    【解决方案1】:

    确实有点神秘。

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

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

    请注意,\n 在 linux 上工作,但可能不在其他控制台类型上!

    【讨论】:

    • 你可能需要匹配dos风格的行尾:expect -re "hi\r?\n"
    • @Kiaus 它与您的建议一起使用,但是对于所有上述代码,即使用 ^ 和 \n,如果字符串“hi”没有作为第一个输入给出,它不会检测到,即如果我们正在按“abcd”、“hi”的顺序输入,它没有检测到……我在 Windows 操作系统中使用命令提示符在 tclsh 中运行代码
    • @Glenn 那没用......我需要代码来检测字符串“hi”,只有当它单独输入时,即不是字符串“hiabc”或abchidef“或”abchi ".... Tcl 中的 "^hi$" 之类的东西
    【解决方案2】:

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

    # 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!"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多