2015-06-22 258 views
2

爲什麼下面不匹配:如何冒號閉括號後匹配

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


> expect test.tcl 
[1]: 
timedout 

如果我更改和刪除匹配的工作冒號:

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

$ expect test.tcl [1] matched

或者如果我擺脫第一支架

expect { timeout {puts timedout\n} 1\]: {puts matched\n} } 那麼它匹配:

$ expect test.tcl 1]: matched

回答

3

,並不是與:問題,但[

[對於TclExpect模式匹配器都是特殊的,所以它特別混亂。要與文字[相匹配,您必須從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將第一個反斜槓解釋爲表示第二個是文字字符。作爲XY命令的結果,Tcl然後產生n*w。模式匹配器最終看到四個字符串n*w。模式匹配器以通常的方式解釋這一點。反斜槓表示n需要逐字匹配(即使沒有反斜槓,由於n對模式匹配器並不是特殊的)。

來源Exploring Expect

+0

謝謝。我沒有意識到工作中有兩個層面的間接性。只是期待一個... – sashang

1

爲我工作的模式:

  • -exact {[1]:}
  • -exact "\[1]:"
  • {\[1]:}
  • "\\\[1]:"